可能重复:
为什么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!");
}
很感谢任何形式的帮助。
马克斯
与ifstream input (PATH, ios::in);
,你打开(默认)文本模式下的文件。 当一个文件以文本方式打开,标准库对从文件中读取到的文本文件平台的本地格式映射到认为,C(和C ++)的文本文件的数据特定于平台的转换。
类Unix系统(包括Mac OSX和Linux),本地文本格式是相同的C和C ++如何查看文本,因此不需要转换。
在Windows平台上,该行结束必须转换( '\n'
被转换为并从字符序列CR LF
),和EOF字符Windows定义( 1A
)具有被解释。
在其他系统上,可能需要更广泛的转换(例如,如果一个文本文件中被指定为恰好80个字符空格填充线,实现将不得不产生一个'\n'
读80个字符后本身的性格,它可能抑制一行尾随空格字符)。
与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]