打开文件没有出现错误,但是文件保持为空。

3

我是一个有用的助手,可以翻译文本。

我遇到了写文件的问题,但问题很奇怪,我甚至不知道应该准确地问什么。

首先:我使用C语言,被迫保持与89/90标准一致,并使用gcc编译。我的操作系统是Windows 7 Home Premium 64位。

我想做的是像这样打开三个文件流:

FILE *A=fopen("A.txt", "r");
FILE *B=fopen("B.txt", "w");
FILE *D=fopen("C.txt", "w");

第一个只读,后面两个可写。在程序运行期间,我使用写入操作。
fprintf(B, "%c", letter);
fprintf(D, "%c", letter);

将整数解释为 ASCII 字符并写入文件。在之前我做了二十次,都是可以正常工作的。但现在,“D” 文件始终为空。如果我改变流的顺序:

FILE *A=fopen("A.txt", "r");
FILE *D=fopen("C.txt", "w");
FILE *B=fopen("B.txt", "w");

我的文件“B”是空的!所以最后打开的那个不起作用。但是为什么?!我看不出与其他能正常工作的程序有任何区别,而且这个程序也能正常工作,除了这第三个文件流的情况。我使用-Wall和-pedantic编译,编译器没有抱怨,程序没有崩溃,一切都正常,只有第三个流出问题!
有人有任何想法,甚至更好的是,遇到过这样的问题吗?我试了一个小时也没得到任何线索。
编辑:谢谢所有的评论!我现在已经学习C语言编程两个月了,所以有很多事情我不是很确定。
@Mhd.Tahawi: 是的,现在我这样做了,但没有任何区别。
@Kninnug: 文件成功打开。
@Bit Fiddling Code Monkey: 是的,据我所知,在某个地方有一个限制。但是一周前我同时使用了6个文件流,一切都很好。
@Pandrei: 是的,另一个文件中的输出很好。
@Martin James: 我不确定你的意思。如果你的意思是fclose或类似的东西:因为你们中有这么多人问我这个,我尝试了一下,但没有任何区别。
@hmjd: 'letter'是一个通过fgetc(A)获得值的整数。
@squeamish ossifrage: 我将一个个字符打印到文件中,并获得每个字符的“1”,似乎没问题。
编辑2:现在,这很好,我面临某种Heisenbug。我要检查返回值,因为你们中有这么多人告诉我这样做。所以我初始化了一个新的int retval=0;并写道:
letter=fgtec(A);
while (letter!=EOF)
{
    retval=fprintf(B, "%c", letter);
    printf("%d", retval); /*Want to see the return values on stdout*/
    if (retval<0) /*If writing fails, the program stops*/
    {
        printf("Error while writing in file");
        return (-1);
    }
    letter=fgetc(A);
}

这个可以正常工作!新文件被填充,一切都很好。除了一个问题,我完全不知道为什么旧的文件:

letter=fgtec(A);
while (letter!=EOF)
{
    fprintf(B, "%c", letter);
    letter=fgetc(A);
}

曾经成功过万次的方法,现在却毫无作用。

有没有其他的想法?不过,非常感谢你们迄今为止提供的建议!


2
你尝试过刷新缓存吗? - Moha the almighty camel
4
你有检查fopen的返回值吗? - Kninnug
4
你开始关闭任何一个了吗? - Martin James
1
你从 fprintf() 得到了什么返回值? - r3mainer
1
另外,C语言没有垃圾回收器...它有退出处理程序,但你仍然应该始终清理自己的代码。而且,在关闭文件时检查返回值,因为它可能会失败! - hyde
显示剩余8条评论
2个回答

5

除非你调用了fclose()函数,否则标准库会缓冲输出数据,直到你写入足够的数据或通过fflush()刷新缓冲区或通过fclose()关闭文件(或通过setbuf()/setvbuf()禁用缓冲区)才能将其写入磁盘。

显然,禁用缓冲区或在每个I/O操作后刷新缓冲区都会使缓冲I/O的整个目的无效,从而降低性能。


我不是完全确定,但我认为 stdio 有一个退出处理程序,它会刷新和关闭所有打开的 FILEs。至少对于 stdoutstderr,它有(即使您的输出没有以换行符结尾,您也不必显式刷新)。因此,除非程序崩溃,否则数据将写入文件。 - hyde
我同意,留下开放的出口处理程序并信任它并不是最好的编程风格,但在我的几次尝试中它运行得很好。然而,我尝试使用fclose,但没有任何区别。 - Wanderer

1
我认为,我找到了问题的源头,所以我想分享一下,这似乎与编译器有关。如上所述,我使用MinGW包中的gcc。我请我的一个朋友,他使用Pelles C自己编译代码,结果!对他来说,它运行良好!因此,gcc在某些条件下可能存在文件流方面的问题。但我无法确定是哪些条件。
然而,如果其他人也遇到了类似的问题,请尝试使用另一个编译器!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接