在C语言中使用相同的标志打开文件的方法是使用fopen函数。

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

在我的文本文件中,输出应该是hello,但为什么它没有被写入呢?"unable" 没有被打印到标准输出流(stdout)上。


1
“unable” 没有被打印出来吗?你不能两次打开同一个文件进行写入。 - Ivaylo Strandjev
1
“unable” 是否被写入标准输出?如果是这种情况,那么 f1 就是 NULL,并且调用 fprintf(f1, ...) 将会失败(如果是这种情况,我很惊讶为什么没有出现分段错误)。 - hmjd
不是的,这就是问题所在。如果那样的话就没事了。 - Vindhya G
别忘了关闭你的文件,使用fclose()函数。 - Mawg says reinstate Monica
如果您因某种原因确实想在此处打开两个文件(可能具有不同的名称),请保持一致。您没有检查第一个打开的成功,这是您应该始终执行的操作。 - Mawg says reinstate Monica
好的,即使它写了“hello”,第一个应该成功吧? - Vindhya G
2个回答

12

你有两个FILE*指向同一个文件,并且它们都指向该文件的开头,因此其中一个写操作将覆盖另一个。

需要注意的是,FILE*通常具有缓冲功能,因此这些小字符串实际上只有在你fclose()或fflush() FILE*时才会写入文件。由于你两者都没有操作,当应用程序退出时系统会自动执行,所以哪个写操作被覆盖取决于系统先关闭哪个FILE*。

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


0

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

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


"fopen()在失败时不一定返回0。当fopen()失败时,它返回0或负值"...您对此十分确定吗?您能提供参考资料吗?例如http://www.csse.uwa.edu.au/programming/ansic-library.html说:“ FILE* fopen(const char* filename,const char* mode);打开文件filename并返回流,如果失败则返回NULL。” - Mawg says reinstate Monica

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