C ++ std :: ifstream std :: ios :: in与std :: ios :: in | std :: ios :: binary,为什么我会得到垃圾数据?

时间:2017-03-30 03:17:04

标签: c++ stl

当我在read对象上调用std::ifstream时,我很好奇,如果我将文件打开为std::ios::in,为什么我会收到垃圾数据,而我不会收到垃圾数据std::ios::in | std::ios::binary

我包含了一些我一直在尝试的杂乱代码的截图。我很困惑为什么我用第一张图片得到垃圾数据,当第二张图片产生std::ios::binary标志设置的正确数据时。

垃圾数据,但文件长度正确: Junk data, but correct file length

没有垃圾数据,文件长度相同: No junk data, same file length

2 个答案:

答案 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