Reputation: 3605
For copying what I read from input file to vector, I used std::copy()
as recommended in Reading an std::ifstream to a vector of lines.
The problem occurs if I use:
std::copy(std::istream_iterator<unsigned char>(inputfile),
std::istream_iterator<unsigned char>(),
std::back_inserter(myVector));
The 16th byte of my file is missing in the myVector
variable.
But if I use the following code:
inputfile.read((char*)&myVector[0], sizeof(int)*getfilesize(nameOfFile));
Then the byte is not missing anymore.
I am trying to parse WAV files and I lost too much time on this, I hope I will learn something new out of this. Can you please tell me what is wrong with the first version of the code above?
Upvotes: 5
Views: 2048
Reputation: 47658
istream_iterator
uses operator >>
to read elements, but operator >>
skip whitespaces.
You may try using noskipws
inputfile >> noskipws;
§ 24.6.1 p1. (my emphasis)
The class template
istream_iterator
is an input iterator (24.2.3) that reads (using operator>>) successive elements from the input stream for which it was constructed....
Upvotes: 7
Reputation: 546073
Like RiaD said, istream_iterator
performs formatted input via operator >>
. The solution is to use unformatted reading on the underlying buffer. To do this, use istreambuf_iterator
:
std::copy(std::istreambuf_iterator<char>(inputfile),
std::istreambuf_iterator<char>(),
std::back_inserter(myVector));
Upvotes: 6
Reputation: 5289
First of all wav file is a binary data, so you should treat it as such, you should open your file in binary mode:
ifstream ifs;
ifs.open ("test.wav", ifstream::in | ifstream::binary);
Then, you have to use ordinary read function that works as you stated.
Upvotes: 0