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

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

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; } 

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

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

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

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

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

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