发布和调试配置中 _fmode 的值不同

Value of _fmode different in Release and Debug Configurations

我正在使用使用 fopen 来处理文本文件 i/o 的 C 代码库。我无法修改代码库。 (它是Lua 5.2.4的源代码。)它调用fopen("filename", "r").

在我的 Visual Studio 2022 版本中,我遇到了 DebugRelease 配置之间非常奇怪的差异。确定 fopen 默认打开模式的 _fmode 全局变量在调试配置中设置为文本(0x4000:_O_TEXT),但在调试配置中设置为二进制(0x8000:_O_BINARY)发布配置。我无法确定可能导致此问题的两者之间的任何差异。

有人有什么想法吗?我知道我可以在我的代码中覆盖 _fmode 的值,但我想深入了解为什么会这样。它可能指向其他问题。

我能够隔离 Lua 代码之外的行为(没有纠缠就不容易呈现。)这段代码展示了问题:

   FILE * myFile = fopen("a-file-that-has-2-lines-of-text", "r");
   if (myFile)
   {
      char buf[4096];
      fgets(buf, sizeof(buf), myFile);
      printf("Final 2 bytes of line: %d %d", buf[strlen(buf)-2], buf[strlen(buf)-1]);
   }

万一有人发现这个问题正在寻找解决方法,您可以通过在初始化中添加这行代码来确定 _fmode 的值为 _O_TEXT。 (我在我项目的DLL初始化例程中添加了它。)

#include <fcntl.h>
.
.
.
_set_fmode(_O_TEXT);

我仍然不知道这种差异是 C++ 运行时的错误还是我的项目有什么奇怪的地方。但是添加那行代码为我解决了这个问题。