为什么Windows不能读取超过0x1A(EOF)字符,而Unix可以?
Why can Windows not read beyond the 0x1A (EOF) character but Unix can?
可能的重复:
为什么在读取时设置故障位?有出路吗?
我正在编写一个小程序,它在Mac OS和Ubuntu(Unix...)上运行得非常出色。程序必须读取数据文件并分离字节(char
s/unsigned char
s)并将它们memcpy()
为浮点数。这将包括获取以下四个值的过程,读取并将它们左移到32位int
,然后将int
的内存复制到float
中。这样:
0x43 0x66 0x1A 0x79 -> 将 int32 和 memcpy() 读入 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
),并且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编译
的- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 在UNIX系统中使用DIR查找文件的字节大小
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 当套接字连接断开时检测C/C++Unix
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- UNIX API 调用:使用 read() 函数打开文件并将其打印到屏幕上会增加额外的随机字符
- 如何在Visual studio的c ++中使用exetated unix字符
- 为什么Windows不能读取超过0x1A(EOF)字符,而Unix可以?
- 带有 UNIX 格式字符的 getline() 文本
- 在UNIX中输出退格字符
- 基于UNIX的聊天室::使用getch()、POSIX线程存储每个字符