在C中使用带有相同标志的fopen打开文件

时间:2012-07-30 14:18:52

标签: c fopen fwrite

我无法理解此代码的输出?

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文件中的OUTPUT hello 。为什么不写? “无法”不会打印到stdout

2 个答案:

答案 0 :(得分:12)

你有2个文件*打开同一个文件,指向文件的开头,所以其中一个写操作会覆盖另一个。

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

如果以附加模式fopen("mytext","a");打开2个文件,您将看到不同的结果,但是当您想要确保在其他文件上操作时,您需要fflush()文件*不会导致交错输出。从不同的进程/线程写入相同的文件将需要更多的关注,例如某种形式的文件锁定。

答案 1 :(得分:0)

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

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