C++11 fgetc 在"r+b"模式下使用时向我的文件输出 0

C++11 fgetc outputs a 0 to my file when used in "r+b" mode

本文关键字:我的 文件 输出 fgetc r+b 模式 C++11      更新时间:2023-10-16

我正在为一种语言的解释器编写一些文件 IO 原语,但我遇到了fgetc的奇怪行为问题。

这是一个可重现的示例(至少在Windows上,没有在Linux上尝试过):

FILE* f = fopen("reprod.txt", "r+b");
fputc('a', f);
fputc('a', f);

从空的 reprod.txt 文件开始,此代码将向该文件写入两个'a'。这很好。但是,以下代码执行一些不同的操作(再次从空文件开始):

FILE* f = fopen("reprod.txt", "r+b");
fputc('a', f);
fputc('a', f);
fgetc(f);

我本来希望fgetc在这里返回EOF(它没有)。相反,它返回0,并将一个额外的 0 字节写入我的文件中!

我已经阅读了fgetc的手册页,它没有提到任何关于这个的内容!作为参考,我在 Windows 11 上使用 g++ 在 C++10 中进行编译。发生这种情况是否有充分的理由,我该如何防止它?

fopen的文档指出,在以更新模式("+")打开文件时,必须在执行后续读取之前调用fflushfseekfsetposrewind。找不到任何关于是否定义了如果您不这样做会发生什么的词。我尝试在Visual Studio 2017中比较此修复程序与无修复程序,它似乎纠正了不需要的行为