在下面的代码中:在下面的代码中:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#define STDOUT 1
char *file_name;
int newfile(char *path)
{
int fd;
mode_t mode = S_IRWXU | S_IRGRP | S_IWGRP | S_IROTH;
if ((fd = creat(path, mode)) < 0) {
fprintf(stderr, "%s: %s: fail to create new file: %s",
file_name, path, strerror(errno));
return -1;
}
return fd;
}
int read2file(int fd)
{
ssize_t wcount;
ssize_t rcount;
char buf[BUFSIZ] = {0};
fprintf(stdout, "Please inpu the content: ");
fprintf(stdout, "%d\n", fd);
while ((rcount = read(STDOUT, buf, sizeof(buf))) > 0) {
wcount = write(fd, buf, rcount);
if (rcount != wcount) {
fprintf(stderr, "%s: fail to write: %s\n",
file_name, strerror(errno));
return 1;
}
}
close(fd);
return 0;
}
int main(int argc, char **argv)
{
char path[BUFSIZ];
int fd;
file_name = argv[0];
printf("Please input the new file path: ");
/*getchar();*/
scanf("%s", path);
fd = newfile(path);
if (fd < 0) {
return -1;
}
read2file(fd);
return 0;
}
如果把 newfile() 中的 creat(path, mode) 换成 open(path, O_CREAT, mode) , 就会报错:
Bad file description
但是,两个函数返回的文件描述符都是 3 。
究竟是为什么?
还有,代码的执行结果有一个问题,就是在 read2file() 函数中的
fprintf(stdout, "Please inpu the content: ");
如果不加上后面这一句:
fprintf(stdout, "%d\n", fd);
那么执行的结果就是:
Please input the new file path: ./2
Hello, world!
Please inpu the content: %
这显然是不正常的。但是如果加上后面的那一句 fprintf(stdout, "%d\n", fd); 那么一切就都正常了:
Please input the new file path: ./2
Please inpu the content: 3
Hello, world!
究竟是为什么到时输出的不正常?
先谢谢大家了!
第一个问题:你需要在 open 的第二参数里加上 O_WRONLY 才行。另外,creat 相当于 open 的时候指定了 O_CREAT|O_WRONLY|O_TRUNC 标记。
第二个问题:你需要 fflush(stdout)。
另外,read(STDOUT, buf, sizeof(buf)) 这句话想干嘛,从 STDOUT 读输入么?而且值定义成了 2,这个应该是 STDEER 才对呢。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。