我正在尝试解决遗留系统中的文件读取问题。
这是一个 32 位 Windows 应用程序,仅在安装了相同 SP、SDK 和 IDE 的 Windows7/SP1/64 位系统上测试和运行。IDE是VS2010/SP1。
这是有问题的代码:
#define ANZSEL 20
int ii, bfil, ipos;
if ((bfil = open("Z:\\whatever.bla", O_RDONLY, 0)) == -1) { goto end; } // please don't complain about this; it's just here because I didn't want to rephrase the if == -1 above and because it's a legacy codebase; i also tried with UNC paths by the way with the same result
ii = read(bfil, &some_struct_instance, sizeof(some_struct));
ipos = _lseek(bfil,0,SEEK_CUR); // ipos shows the correct position here, ie. sizeof(some_struct)
if (ii == sizeof(some_struct)) {
ii = read(bfil, &another_struct_instance, sizeof(another_struct)*ANZSEL); // ii here sometimes shows 15 instead of sizeof(another_struct)*ANZSEL
ipos = _lseek(bfil,0,SEEK_CUR); // ipos always shows the correct value of sizeof(some_struct) + sizeof(another_struct)*ANZSEL
if (ii == sizeof(another_struct)*ANZSEL) {
// should always come here as long as the files' long enough
如您所见,它应该是一个普通的、旧的直接二进制读入某些结构。我可以观察到的是,当我创建文件并首先使用 memset/Zeromem 清除结构以“初始化”所有填充字节时使用 0x00 而不是 0xCC(这是微软在调试模式下将 mem 标记为未初始化的方式stack mem) 问题在之前没有正确运行的系统上消失了。
虽然我似乎很清楚如何“正确”解决问题 - 在 open() 中指定 O_BINARY 就像
if ((bfil = open("Z:\\whatever.bla", O_RDONLY|O_BINARY, 0)) == -1)
我不知道为什么这会表现得如此不同。我试图在两个系统上逐步检查 open() 和 read() 的来源,但由于我很少能够访问唯一可以重现问题的系统,所以我还没有找到任何东西。
因此,我的问题是是否有人可以指出为什么会发生这种情况并参考一些文档。