为什么Windows不能读取超出0x1A(EOF)字符但Unix可以?

时间:2012-11-27 11:03:22

标签: c++ memory error-handling fstream eof

  

可能重复:
  Why failbit set when eof on read? Is there a way out?

我正在编写一个小程序,它在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!");
}

非常感谢任何帮助。

最高

2 个答案:

答案 0 :(得分:5)

使用ifstream input (PATH, ios::in);,您可以在(默认)文本模式下打开文件。在文本模式下打开文件时,标准库对从文件读取的数据执行特定于平台的转换,以将平台的文本文件本机格式映射到C(和C ++)具有文本文件的视图中。

对于类Unix系统(包括Mac OSX和Linux),本机文本格式与C和C ++查看文本的方式相同,因此不需要转换。

在Windows平台上,必须转换行尾('\n'转换为字符序列CR LF)和Windows定义的EOF字符(1A)必须解释。

在其他系统上,可能需要更广泛的转换(例如,如果将文本文件指定为80个字符的空格填充行,则实现后必须自己生成'\n'个字符。读取80个字符,它可能会抑制一行中的尾随空格字符。

答案 1 :(得分:1)

with ios :: binary flag:

#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

在此示例中,数据由char读取char,但您可以使用ifstream.read(buffer, buffersize)使其适应您的用例。

顺便说一下,这个程序是在Windows7上使用gcc编译的。