为什么可以在Windows无法读取超出0x1A的(EOF)字符,但Unix的可以吗? [重复](

2019-08-03 05:23发布

可能重复:
为什么failbit EOF当上阅读设置? 有出路吗?

我写了一个小程序,它是在Mac OS和Ubuntu(Unix的......)出色的工作。 该方案具有在数据文件中读取并分离字节( char S / unsigned char S)和memcpy()它们变成浮动。 这将包括拍摄过程说以下四个值,读取&左移它们变成32位int ,然后复制int内存成float 。 像这样:

0x43 0x66 0x1A 0x79 -> read in int32 and memcpy() into float -> val = 230.103

正如我所说的,这工作正常为Unix,但Windows似乎解释char 0x1A为文件(EOF)错误的一端,并停止读取数据。 为什么Windows做这样的事情,而不是Unix的? 我怎么可能把它关掉?

我甚至看在尝试错误处理ifstream本身,并检查EOL标志已设置。 然后,我会clear()ifstream的错误标志,并继续阅读(使用get() ),但该死的东西总是返回相同的EOF / 0x1A字符和下一个字符不读。

编辑:添加一些代码


ifstream input (PATH, ios::in);
if (input.is_open()) {
  unsigned int counter = 0;
  while (input.good()) {
    BYTE byte;
    byte = input.get();
    printf("%i, ", byte);
    counter++;
  }
  printf("\r%i, ", counter);
  input.close();
} else {
  printf("Can't open file!");
}

很感谢任何形式的帮助。

马克斯

Answer 1:

ifstream input (PATH, ios::in); ,你打开(默认)文本模式下的文件。 当一个文件以文本方式打开,标准库对从文件中读取到的文本文件平台的本地格式映射到认为,C(和C ++)的文本文件的数据特定于平台的转换。

类Unix系统(包括Mac OSX和Linux),本地文本格式是相同的C和C ++如何查看文本,因此不需要转换。

在Windows平台上,该行结束必须转换( '\n'被转换为并从字符序列CR LF ),和EOF字符Windows定义( 1A )具有被解释。

在其他系统上,可能需要更广泛的转换(例如,如果一个文本文件中被指定为恰好80个字符空格填充线,实现将不得不产生一个'\n'读80个字符后本身的性格,它可能抑制一行尾随空格字符)。



Answer 2:

与IOS ::二进制标志:

#include <iostream>
#include <fstream>
#include <windows.h>

int main()
{

    std::ifstream input ("msg.txt",  std::ios::binary );
    if (input.is_open())
    {
        unsigned int counter = 0;
        while (input.good()) 
        {
            BYTE byte;
            byte = input.get();
            printf("%d : %d \n", counter,  byte);
            counter++;
        }

        input.close();
    }
}

输入数据: 0x43 0x66 0x1A 0x79 0x68 0xAc

输出:

0 : 48 
1 : 120 
2 : 52 
3 : 51 
4 : 32 
5 : 48 
6 : 120 
7 : 54 
8 : 54 
9 : 32 
10 : 48 
11 : 120 
12 : 49 
13 : 65 
14 : 32 
15 : 48 
16 : 120 
17 : 55 
18 : 57 
19 : 32 
20 : 48 
21 : 120 
22 : 54 
23 : 56 
24 : 32 
25 : 48 
26 : 120 
27 : 65 
28 : 99 
29 : 32 
30 : 255

在这个例子中,数据被读取字符字符,但你可以用它来适应你的使用情况ifstream.read(buffer, buffersize)

顺便说一句,这个程序与Windows7的上GCC编译



文章来源: Why can Windows not read beyond the 0x1A (EOF) character but Unix can? [duplicate]