以下代码应该将“some text”写入demo.txt,但它不起作用:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
FILE *fp;
int fd;
if ((fd = open("demo.txt", O_RDWR)) == -1) {
perror("open");
exit(1);
}
fp = fdopen(fd, "w");
fprintf(fp, "some text\n");
close(fd);
return 0;
}
答案 0 :(得分:2)
在关闭文件之前,您应该使用fflush(fp)
清除缓冲区。
当您写入文件描述符fp
时,数据将被缓冲。
但是,在将缓冲的数据写入文件close(fd)
之前,您将使用demo.txt
关闭文件。因此,缓冲的数据丢失。
如果执行fflush(fp)
,它将确保立即将缓冲数据写入demo.txt。
在对所有已打开的文件执行close()
之前,不应致电fclose()
。
正确的方法是先fclose(fp)
再做close(fd)
。
答案 1 :(得分:2)
传递给fdopen()
的模式标志必须与文件描述符的模式兼容。文件描述符的模式为O_RDWR
,但您正在执行:
fp = fdopen(fd, "w");
这可能不起作用(这是未定义的行为。)而是以"r+"
模式打开:
fp = fdopen(fd, "r+");
或者,使用O_WRONLY
作为文件描述符:
open("demo.txt", O_WRONLY)
然后,您可以fdopen()
模式"w"
。
最后,关闭FILE
结构,而不是关闭文件描述符:
fclose(fp);
如果不这样做,fp
将丢失其基础文件描述符。在此之后,您不能尝试手动关闭文件描述符。 fclose()
可以自行完成。
答案 2 :(得分:1)
使用fclose(fp)代替close(fd)