发布和调试配置中 _fmode 的值不同
Value of _fmode different in Release and Debug Configurations
我正在使用使用 fopen
来处理文本文件 i/o 的 C 代码库。我无法修改代码库。 (它是Lua 5.2.4的源代码。)它调用fopen("filename", "r")
.
在我的 Visual Studio 2022 版本中,我遇到了 Debug
和 Release
配置之间非常奇怪的差异。确定 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++ 运行时的错误还是我的项目有什么奇怪的地方。但是添加那行代码为我解决了这个问题。
我正在使用使用 fopen
来处理文本文件 i/o 的 C 代码库。我无法修改代码库。 (它是Lua 5.2.4的源代码。)它调用fopen("filename", "r")
.
在我的 Visual Studio 2022 版本中,我遇到了 Debug
和 Release
配置之间非常奇怪的差异。确定 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++ 运行时的错误还是我的项目有什么奇怪的地方。但是添加那行代码为我解决了这个问题。