I am working with a C codebase that uses fopen
to do text file i/o. I cannot modify the codebase. (It is the source code of Lua 5.2.4.) It calls fopen("filename", "r")
.
In my Visual Studio 2022 builds I am encountering a very weird discrepancy between the Debug
and Release
configurations. The _fmode
global variable that determines the default open mode for fopen
is set to text (0x4000: _O_TEXT
) in the Debug configuration but binary (0x8000: _O_BINARY
) in the Release configuration. I have been unable to determine any difference between the two that might cause this.
Does anyone have any ideas? I know I can override the value of _fmode
in my code, but I'd like to get to the bottom of why this is happening. It may point to other issues.
I was able to isolate the behavior outside the Lua code (which is not easy to present without entanglements.) This code exhibits the issue:
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]);
}
In case anyone finds this question looking for a way to solve it, you can make certain the value of _fmode
is _O_TEXT
by adding this line of code in your initialization. (I added it in the DLL initialization routine of my project.)
#include <fcntl.h>
.
.
.
_set_fmode(_O_TEXT);
I still do not know if this discrepancy is a bug in the C++ runtime or something weird about my project. But adding that line of code solved it for me.