首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fdopen和fprintf

fdopen和fprintf
EN

Stack Overflow用户
提问于 2012-10-31 19:30:28
回答 3查看 5.3K关注 0票数 0

以下代码将向demo.txt写入“一些文本”,但它不起作用:

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-31 19:34:06

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

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

您不应该在对所有打开的文件执行fclose()之前调用close()

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

票数 2
EN

Stack Overflow用户

发布于 2012-10-31 19:40:31

传递给fdopen()的模式标志必须与文件描述符的模式兼容。文件描述符的模式是O_RDWR,但您正在执行以下操作:

代码语言:javascript
复制
fp = fdopen(fd, "w");

这可能不起作用(这是未定义的行为)。而应在"r+"模式下打开:

代码语言:javascript
复制
fp = fdopen(fd, "r+");

或者,使用O_WRONLY作为文件描述符:

代码语言:javascript
复制
open("demo.txt", O_WRONLY)

然后,您可以在"w"模式下使用fdopen()

最后,关闭FILE结构而不是关闭文件描述符:

代码语言:javascript
复制
fclose(fp);

如果不这样做,fp将丢失其底层文件描述符。在此之后,您不能尝试手动关闭文件描述符。fclose()自己做到了这一点。

票数 2
EN

Stack Overflow用户

发布于 2012-10-31 19:36:14

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13156902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档