为了将我从输入文件中读取的内容复制到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文件,我在这上面浪费了太多时间,我希望我能从中学到新东西。你能否告诉我上面代码的第一个版本有什么问题?
答案 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);
然后,您必须使用按照您所说的方式工作的普通读取功能。