2012-10-31 17 views
0

下面的代码应该写入“一些文本”,以demo.txt,但它不工作:fdopen和fprintf

#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

你确定是否存在demo.txt文件? – Whoami

+0

是的,当然,和dprintf(fd,“一些文本\ n”)工作 –

回答

2

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

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

对于所有打开的文件,在对fclose()执行操作之前,您不应该致电close()

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

+1

请注意,这只是一个黑客。代码有多个问题,正如我的答案中所述;最重要的是文件描述符“fp”依赖于正在关闭。 –

+0

您不应该对传递给'fdopen'的文件描述符调用'close',因为关闭FILE流会刷新并再次关闭它,即使同一个文件描述符可能已经被分配了新的用法。这非常危险;它可能会破坏您打开的其他文件。如果你想能够安全地关闭原来的fd,你应该在传递给'fdopen'之前调用'dup',并使用带有'fdopen'的重复描述符。 –

+0

我忘了提及,即使您根本不调用'fclose',所有'FILE'流在退出时都隐式关闭。 –

1

使用FCLOSE(FP),而不是关闭(FD)

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()自己做。

+0

感谢尼科斯,(O_WRONLY | O_CREAT)是否对应于fdopen(fd,“a”)? –

+2

不需要。“a”只能在文件末尾写入。即使你在其他地方寻找,你也不能在最后写任何地方。这对应于O_APPEND。 –