Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ read()返回在某些系统上读取的错误字节数_C++_Windows_File Io_Posix Api - Fatal编程技术网

C++ read()返回在某些系统上读取的错误字节数

C++ read()返回在某些系统上读取的错误字节数,c++,windows,file-io,posix-api,C++,Windows,File Io,Posix Api,我试图解决遗留系统中的文件读取问题 它是一个32位windows应用程序,仅在Windows7/SP1/64位系统上测试和运行,这些系统都安装了相同的SP、SDK和IDE。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

我试图解决遗留系统中的文件读取问题

它是一个32位windows应用程序,仅在Windows7/SP1/64位系统上测试和运行,这些系统都安装了相同的SP、SDK和IDE。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“init”所有填充字节(这是microsoft在调试模式下将mem标记为未初始化堆栈mem的方法),该问题在系统上消失,因为它以前的行为不正确

虽然我似乎很清楚如何“正确”解决这个问题,但在open()中指定O_二进制,如

我不知道为什么这会表现得如此不同。 我试图在这两个系统上逐步查找open()和read()的源代码,但由于我很少能够访问唯一可以重现问题的系统,所以我还没有找到任何答案


因此,我的问题是,是否有人可以指出这种情况发生的原因并引用一些文档。

当文件包含值
0x1a
(又称control-Z)时,通常会发生这种情况。与之前的MS-DOS一样,Windows将control-Z解释为一个文本文件结束的信号,因此当您以文本模式打开一个文件,文件到达0x1a时,它将停止读取


正如您已经发现的,以二进制模式打开文件可以解决问题——0x1a不再被解释为文件结束的信号。

当文件包含值
0x1a
(又称control-Z)时,通常会发生这种情况。与之前的MS-DOS一样,Windows将control-Z解释为一个文本文件结束的信号,因此当您以文本模式打开一个文件,文件到达0x1a时,它将停止读取


正如您已经发现的,以二进制模式打开文件可以解决问题——0x1a不再被解释为文件结束的信号。

当文件包含值
0x1a
(又称control-Z)时,通常会发生这种情况。与之前的MS-DOS一样,Windows将control-Z解释为一个文本文件结束的信号,因此当您以文本模式打开一个文件,文件到达0x1a时,它将停止读取


正如您已经发现的,以二进制模式打开文件可以解决问题——0x1a不再被解释为文件结束的信号。

当文件包含值
0x1a
(又称control-Z)时,通常会发生这种情况。与之前的MS-DOS一样,Windows将control-Z解释为一个文本文件结束的信号,因此当您以文本模式打开一个文件,文件到达0x1a时,它将停止读取


正如您已经发现的,以二进制模式打开文件可以解决问题——0x1a不再被解释为文件结束的信号。

@JerryCoffin我刚看了一下,但文件中没有任何0x1a。顺便说一句,我总是在所有系统上使用相同的文件进行测试。在文本模式下,CR-LF对被替换为单个LF。还可能值得注意的是,(至少在Visual Studio中,
read
open
POSIX调用是不推荐的。@icabod都是真的,但它不应该在所有系统上导致相同的行为吗?顺便说一句,当然是impl。由于我们计划扩展到64位,可能还会扩展到具有不同endian的系统,所以将更改为字节顺序不可知的内容,但我只是好奇我错过了read()和friendsAh的哪些内容,抱歉,我没有完全阅读这个问题。发生问题的系统是什么?是否始终是同一个系统出现故障?抱歉@JerryCoffin,您击中了关键点,我收到了错误的文件进行测试:| 0x1A确实位于读取停止的确切索引(…+15)处。如果你愿意,把你的评论复制成一个答案,我很乐意接受。感谢you@JerryCoffin我只是看了一下,但文件中没有任何0x1a。顺便说一句,我总是在所有系统上使用相同的文件进行测试。在文本模式下,CR-LF对被替换为单个LF。还可能值得注意的是,(至少在Visual Studio中,
read
open
POSIX调用是不推荐的。@icabod都是真的,但它不应该在所有系统上导致相同的行为吗?顺便说一句,当然是impl。由于我们计划扩展到64位,可能还会扩展到具有不同endian的系统,所以将更改为字节顺序不可知的内容,但我只是好奇我错过了read()和friendsAh的哪些内容,抱歉,我没有完全阅读这个问题。发生问题的系统是什么?是否始终是同一个系统出现故障?抱歉@JerryCoffin,您击中了关键点,我收到了错误的文件进行测试:| 0x1A确实位于读取停止的确切索引(…+15)处。如果你愿意,把你的评论复制成一个答案,我很乐意接受。感谢you@JerryCoffin我只是看了一下,但文件中没有任何0x1a。顺便说一句,我总是在所有系统上使用相同的文件进行测试。在文本模式下,CR-LF对被替换为单个LF。还可能值得注意的是,(至少在Visual Studio中,
read
open
POSIX调用是不推荐的。@icabod都是真的,但它不应该在所有系统上导致相同的行为吗?顺便说一句,当然是impl。由于我们计划扩展到64位,可能还会扩展到具有不同endian的系统,所以将更改为字节顺序不可知的内容,但我只是好奇我错过了read()和friendsAh的哪些内容,抱歉,我没有完全阅读这个问题。发生问题的系统是什么?是否始终是同一个系统出现故障?抱歉@JerryCoffin,您击中了关键点,我收到了错误的文件进行测试:| 0x1A确实位于读取停止的确切索引(…+15)处。如果你愿意,把你的评论复制成一个答案,我很乐意接受。感谢you@JerryCoffin我只是看了一下,但文件中没有任何0x1a。我总是和我们在一起
if ((bfil = open("Z:\\whatever.bla", O_RDONLY|O_BINARY, 0)) == -1)