Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Some bytes are missing after reading an std::ifstream to a vector of lines

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?

like image 728
Kadir Erdem Demir Avatar asked Jul 21 '13 19:07

Kadir Erdem Demir


2 Answers

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....

like image 86
RiaD Avatar answered Oct 17 '22 02:10

RiaD


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));
like image 5
Konrad Rudolph Avatar answered Oct 17 '22 04:10

Konrad Rudolph