将std :: ifstream读取到行向量后,有些字节丢失了

时间:2013-07-21 19:28:01

标签: c++ istream-iterator

为了将我从输入文件中读取的内容复制到vector,我使用了Reading an std::ifstream to a vector of lines中建议的std::copy()

如果我使用:

,则会出现问题
std::copy(std::istream_iterator<unsigned char>(inputfile),
          std::istream_iterator<unsigned char>(),
          std::back_inserter(myVector));

myVector变量中缺少我文件的第16个字节。

但如果我使用以下代码:

inputfile.read((char*)&myVector[0], sizeof(int)*getfilesize(nameOfFile));

然后字节不再丢失。

我正在尝试解析WAV文件,我在这上面浪费了太多时间,我希望我能从中学到新东西。你能否告诉我上面代码的第一个版本有什么问题?

3 个答案:

答案 0 :(得分:6)

istream_iterator使用operator >>来读取元素,但operator >>会跳过空格。

您可以尝试使用noskipws

inputfile >> noskipws;

§24.6.1p1。 (我的重点)

  

类模板istream_iterator是一个输入迭代器(24.2.3),它连续读取(使用运算符&gt;&gt;)   来自输入流的元素....

答案 1 :(得分:5)

如RiaD所说,istream_iterator通过operator >>执行格式化输入。解决方案是在底层缓冲区上使用未格式化的读取。为此,请使用istreambuf_iterator

std::copy(std::istreambuf_iterator<char>(inputfile),
          std::istreambuf_iterator<char>(),
          std::back_inserter(myVector));

答案 2 :(得分:1)

首先wav文件是二进制数据,所以你应该这样对待它,你应该以二进制模式打开你的文件:

ifstream ifs;
ifs.open ("test.wav", ifstream::in | ifstream::binary);

然后,您必须使用按照您所说的方式工作的普通读取功能。

ifstream documentation