我正在研究unix system calls
。
我想使用string
从standard input
阅读read()
,然后使用write()
将其写入文件。
我可以open
read
文件string
standard 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
输出
write
它正常运行,如果我string
standard output
到write()
问题:
1)\n
有什么问题?
2)我想在行尾添加换行符standard input
。如何才能通过{{1}}?
答案 0 :(得分: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);
答案 1 :(得分:2)
if(fd != -1)
printf("open error\n");
这看起来不对。如果您的输出不是“打开错误”,则可能意味着您对open
的调用失败,因为您只能在未能打开文件时尝试写入文件。
一个好主意是在打印错误时打印错误,将错误打印到stderr,而不是stdout,并在出错时立即退出。尝试使用perror
打印错误消息。
另外,我不喜欢这个评论:
#include <unistd.h> // to remove WARNINGS LIKE warning: implicit declaration of function ‘read’ , warning: implicit declaration of function ‘write’
“删除警告”不需要包含。需要让你的程序正确。