3

我无法理解这段代码的输出?

int main()
{
    FILE* f, *f1;
    f = fopen("mytext", "w");
    if ((f1 = fopen("mytext", "w")) == 0)
       printf("unable\n");
    fprintf(f, "hello\n");
    fprintf(f1, "hi\n");
    return 0;
}

输出是mytext 文件中的hello。为什么不写?“无法”不会打印到stdout

4

2 回答 2

12

您有 2 个 FILE* 打开同一个文件,指向文件的开头,因此其中一个写入会覆盖另一个。

另请注意,FILE* 通常是缓冲的,因此当您对 FILE* 执行 fclose() 或 fflush() 时,这些小字符串实际上会写入文件。由于您两者都不做,系统将在应用程序退出时执行它,因此覆盖哪个写入取决于系统首先关闭哪个文件。

如果您以附加模式打开 2 个文件fopen("mytext","a");,您会看到不同的结果,但是当您想确保对另一个 FILE* 进行操作不会导致交错输出时,您需要 fflush() FILE*。从不同的进程/线程写入同一个文件会更加小心,例如某种形式的文件锁定。

于 2012-07-30T14:24:54.373 回答
0

您有 2 个文件指针试图同时以写入模式打开文件。*f 成功打开文件并获得对文件的锁定。在代码中,文件未关闭,另一个指针试图以写入模式打开同一个文件,但由于未获取锁而失败。fopen() 失败时不一定返回 0。当 fopen() 失败时,它返回 0 或负值. 在这种情况下,您只检查 f1 == 0 ,即使 fopen 指针 f1 失败并且因此无法打印到控制台,这也可能不是真的。继续, f 有一个有效的打开文件是写入模式,因此“hello”被写入文件。但是当您尝试将“hi”写入同一个文件但使用未初始化的不同指针时,fprintf 失败。因此,只有“hello”被写入文件,“hi”失败。

正确的用法是打开文件写“hello”关闭文件,然后以写模式再次打开它并写“hi”。在这种情况下,您只会看到“hi”,因为它会覆盖“hello”。

于 2012-07-30T16:46:08.617 回答