fdopen和fprintf

时间:2012-10-31 11:30:28

标签: c file-descriptor

以下代码应该将“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;
}

3 个答案:

答案 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)