0

我正在努力unix system calls。我想stringstandard inputusing中读取read(),然后使用write().

我可以到open文件,readstringstandard input但不能到write文件。

我的代码是:

#include <unistd.h>     // to remove WARNINGS LIKE  warning: implicit declaration of       function ‘read’ , warning: implicit declaration of function ‘write’
#include<fcntl.h>         /* defines options flags */
#include<sys/types.h>     /* defines types used by sys/stat.h */
#include<sys/stat.h>      /* defines S_IREAD & S_IWRITE  */
#include<stdio.h>

int main(void)
 {
 int fd,readd;
 char *buf[1024]; 


    fd = open("myfile",O_RDWR);
    if(fd != -1)
         printf("open error\n");
    else
    {
        // read i\p from stdin , and write it to myfile.txt

            if((readd=read(0,buf,sizeof(buf)))<0)
              printf("read error\n");
            else
             {
                    printf("\n%s",buf);
                    printf("\n%d",readd);
                if(write(fd,buf,readd) != readd)
                      printf("write error\n");

              }
    } 

return 0;
}

输出是

    write error

它工作正常,如果我writestringstandard output

问题 :

1)有什么问题write()

2)我想在行尾包含换行符\n。怎么可能通过standard input

4

2 回答 2

3
fd = open("myfile",O_RDWR);

这将打开一个现有文件。如果该文件不存在,则会出现错误。您可以使用 perror() 获取更多错误描述。

fd = open("myfile",O_RDWR);
if (fd == -1) {
   perror("open failed");
   exit(1);
}

这里的错误是您的错误检查逻辑是错误的。

if(fd != -1)
     printf("open error\n");

应该

if(fd == -1)
     printf("open error\n"); //or better yet, perror("open error");

更正后,如果文件尚不存在,则在打开文件时仍会出现错误。要创建该文件,您还需要一个附加标志,并为其赋予适当的权限:

fd = open("myfile",O_RDWR|O_CREAT, 0664);
于 2013-09-06T11:06:43.920 回答
2
if(fd != -1)
     printf("open error\n");

这看起来不对。如果您的输出不是“打开错误”,则可能意味着您的调用open失败,因为您仅在打开文件失败时才尝试写入文件。

一个好主意是在打印错误时打印 errno,将错误打印到 stderr,而不是 stdout,并在出错时立即退出。尝试perror用于打印错误消息。

另外,我不喜欢这样的评论:

#include <unistd.h>     // to remove WARNINGS LIKE  warning: implicit declaration of       function ‘read’ , warning: implicit declaration of function ‘write’

“删除警告”不需要包含。它需要使您的程序正确。

于 2013-09-06T11:00:43.207 回答