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

Why can Windows not read beyond the 0x1A (EOF) character but Unix can?

本文关键字:字符 Unix 可以 EOF 不能读 不能 Windows 读取 0x1A 为什么      更新时间:2023-10-16

可能的重复:
为什么在读取时设置故障位?有出路吗?

我正在编写一个小程序,它在Mac OS和Ubuntu(Unix...)上运行得非常出色。程序必须读取数据文件并分离字节(chars/unsigned chars)并将它们memcpy()为浮点数。这将包括获取以下四个值的过程,读取并将它们左移到32位int,然后将int的内存复制到float中。这样:

0x43 0x66 0x1A 0x79 -> 将 int32 和 memcpy() 读入 float -> val = 230.103

正如我所说,这对 Unix 来说工作正常,但 Windows 似乎将char0x1A解释为文件结束 (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),并且Windows定义的EOF字符(1A)必须被解释。

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

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

在此示例中,数据是逐个字符读取的,但您可以使用ifstream.read(buffer, buffersize)对其进行调整以适应您的用例。

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