5

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

如果我使用,就会出现问题:

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 文件,我在这方面浪费了太多时间,我希望我能从中学到一些新东西。你能告诉我上面代码的第一个版本有什么问题吗?

4

3 回答 3

7

istream_iterator用于operator >>读取元素,但operator >>跳过空格。

您可以尝试使用noskipws

inputfile >> noskipws;

§ 24.6.1 p1。(我的重点)

类模板是一个输入迭代器(24.2.3),它从构造它的输入流istream_iterator中读取(使用运算符>>)连续元素......

于 2013-07-21T19:43:39.790 回答
5

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

std::copy(std::istreambuf_iterator<char>(inputfile),
          std::istreambuf_iterator<char>(),
          std::back_inserter(myVector));
于 2013-07-21T19:49:34.523 回答
1

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

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

然后,您必须使用如您所说的那样工作的普通读取功能。

ifstream 文档

于 2013-07-21T19:43:40.357 回答