我正在编写一个小程序,它在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!");
}
非常感谢任何帮助。
最高
答案 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编译的。