fopen没有错误,但文件保持空白

时间:2013-12-06 20:05:29

标签: c filestream fopen

我在写一个文件时遇到了麻烦,但问题很奇怪,我甚至不知道我应该要求什么。

首先:我使用C,我被迫让它同意89/90-standard和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-charachters到文件中。我之前做过二十次,总是有效。现在,“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',似乎没问题。


Edit2:现在,这很好,我正面对某种海森堡。我打算检查返回值,正如你们许多人告诉我的那样。

所以我初始化了一个新的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 个答案:

答案 0 :(得分:5)

除非您调用fclose(),否则您的标准库将缓冲输出数据,在您写入足够的内容之前,您将无法在磁盘上看到它,或者通过fflush()刷新它或通过{{关闭文件1}}(或通过fclose()禁用缓冲。)

显然,在每次I / O操作后禁用缓冲或刷新都会消除缓冲I / O的整个目的,使性能不理想。

答案 1 :(得分:1)

我认为,我找到了问题的根源,所以我认为分享可能会有所帮助,它似乎与编译器有关。 如上所述,我使用gcc作为MinGW包的一部分。 我问我的一个朋友,他使用Pelles C,自己编译代码,瞧!对他来说,它运作良好! 因此,在某些情况下,gcc似乎可能存在文件流问题。但我不能说,哪个条件。

但是,如果其他人有这样的问题,请尝试使用其他编译器!