当我在read
对象上调用std::ifstream
时,我很好奇,如果我将文件打开为std::ios::in
,为什么我会收到垃圾数据,而我不会收到垃圾数据std::ios::in | std::ios::binary
?
我包含了一些我一直在尝试的杂乱代码的截图。我很困惑为什么我用第一张图片得到垃圾数据,当第二张图片产生std::ios::binary
标志设置的正确数据时。
答案 0 :(得分:1)
在文字模式下,某些字符可能会被转换。
在cppreference上,它说明了文件的二进制与文本模式:
从文本流中读入的数据保证比较等于 早先写入该流的数据仅在所有的数据中 以下是真的:
数据仅包含打印字符和控件 characters \ t和\ n(特别是在Windows操作系统上, 字符'\ 0x1A'终止输入)
no \ n后面紧跟空格字符(空格 立即写出的字符 在读取之前\ n可能会消失
最后一个字符是\ n
猜测我会说输入文件中的某些字符不符合这些规则。
答案 1 :(得分:1)
在文本模式下,文件位置不是您可以读取的字节数。
所以当你寻找到最后,看到文件位置是24时,这并不意味着你可以读取24个字节。实际上你只读了20个字节,但你的循环运行了24次,打印了20个读取字节,另外4个垃圾字节来自内存中的任何内容。
要查找已读取的实际字节数,您可以在致电file_data.gcount()
后致电file_data.read
。