Для копирования того, что я прочитал из входного файла в вектор, я использовал std::copy()
как рекомендуется в Чтение std :: ifstream к вектору строк.
Проблема возникает, если я использую:
std::copy(std::istream_iterator<unsigned char>(inputfile),
std::istream_iterator<unsigned char>(),
std::back_inserter(myVector));
16-й байт моего файла отсутствует в myVector
переменная.
Но если я использую следующий код:
inputfile.read((char*)&myVector[0], sizeof(int)*getfilesize(nameOfFile));
Тогда байт больше не пропадает.
Я пытаюсь разобрать файлы WAV, и я потерял слишком много времени на этом, я надеюсь, что я узнаю что-то новое из этого. Подскажите, пожалуйста, что не так с первой версией кода выше?
istream_iterator
использования operator >>
читать элементы, но operator >>
пропустить пробелы.
Вы можете попробовать использовать noskipws
inputfile >> noskipws;
§ 24.6.1 р1. (мой акцент)
Шаблон класса
istream_iterator
является входным итератором (24.2.3), который читает (используя оператор >>) последующий
элементы из входного потока, для которого он был построен ….
Как сказал RiaD, istream_iterator
выполняет форматированный ввод через operator >>
, Решение состоит в том, чтобы использовать неформатированное чтение базового буфера. Для этого используйте istreambuf_iterator
:
std::copy(std::istreambuf_iterator<char>(inputfile),
std::istreambuf_iterator<char>(),
std::back_inserter(myVector));
Прежде всего, wav-файл — это двоичные данные, поэтому вы должны обращаться с ними как с таковыми, открыв файл в двоичном режиме:
ifstream ifs;
ifs.open ("test.wav", ifstream::in | ifstream::binary);
Затем вы должны использовать обычную функцию чтения, которая работает так, как вы заявили.