Некоторые байты отсутствуют после чтения std :: ifstream в вектор строк

Для копирования того, что я прочитал из входного файла в вектор, я использовал 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, и я потерял слишком много времени на этом, я надеюсь, что я узнаю что-то новое из этого. Подскажите, пожалуйста, что не так с первой версией кода выше?

5

Решение

istream_iterator использования operator >> читать элементы, но operator >> пропустить пробелы.

Вы можете попробовать использовать noskipws

inputfile >> noskipws;

§ 24.6.1 р1. (мой акцент)

Шаблон класса istream_iterator является входным итератором (24.2.3), который читает (используя оператор >>) последующий
элементы из входного потока, для которого он был построен ….

6

Другие решения

Как сказал RiaD, istream_iterator выполняет форматированный ввод через operator >>, Решение состоит в том, чтобы использовать неформатированное чтение базового буфера. Для этого используйте istreambuf_iterator:

std::copy(std::istreambuf_iterator<char>(inputfile),
std::istreambuf_iterator<char>(),
std::back_inserter(myVector));
5

Прежде всего, wav-файл — это двоичные данные, поэтому вы должны обращаться с ними как с таковыми, открыв файл в двоичном режиме:

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

Затем вы должны использовать обычную функцию чтения, которая работает так, как вы заявили.

документация ifstream

1
По вопросам рекламы [email protected]