0

以下代码预计会向 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;
}
4

3 回答 3

2

您应该fflush(fp)在关闭文件之前使用清除缓冲区。

当您写入文件描述符fp时,数据被缓冲。但是您close(fd)在将缓冲数据写入文件之前关闭文件demo.txt。因此,缓冲数据丢失。如果这样做fflush(fp),它将确保缓冲的数据立即写入 demo.txt。

在为所有打开的文件close()做之前,你不应该打电话。fclose()

正确的做法是先做fclose(fp)后做close(fd)

于 2012-10-31T11:34:05.830 回答
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()自己做。

于 2012-10-31T11:40:31.210 回答
1

使用 fclose(fp) 而不是 close(fd)

于 2012-10-31T11:36:13.590 回答