2013-07-21 6 views
5

Для копирования того, что я прочитал из входного файла в вектор, я использовал std::copy(), как рекомендовано в Reading an std::ifstream to a vector of lines.Некоторые байты отсутствуют после чтения 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, и я потерял слишком много времени на этом, я надеюсь, что я узнаю что-то новое из этого. Не могли бы вы рассказать мне, что не так с первой версией кода выше?

+1

В первой версии используется форматированная входная функция, таким образом пропуская, например, что он интерпретирует как пробелы. – dyp

+1

Открыт ли файл в двоичном режиме в обоих случаях? –

+0

Да, я ничего не менял, кроме выше. Я использовал ifstream как; std :: ifstream inputfile (nameOfFile.c_str(), std :: ifstream :: in | std :: ifstream :: binary); –

ответ

6

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

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

inputfile >> noskipws; 

§ 24.6.1 p1. (Курсив мой) шаблон

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

+0

... iff установлен флаг skipws, по умолчанию он установлен. – dyp

+0

Спасибо, по крайней мере, хорошо узнать новые вещи. –

+1

Лучшее решение, если вы хотите прочитать двоичные байты. может быть использовано 'std :: istreambuf_iterator'. –

1

Прежде всего файла WAV является двоичные данные, так что вы должны рассматривать его как таковой, вы должны открыть файл в двоичном режиме:

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

Затем вы должны использовать или dinary read, которая работает, как вы заявили.

ifstream documentation

+0

Почему я получил downvote? – nio

5

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

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

Разве это не 'char' для' std :: ifstream'? – dyp

+0

@ DyP Правильно, я * всегда * делаю эту ошибку. –