Подтвердить что ты не робот

Чтение двоичного файла в вектор <char> чтение менее полного файла

У меня есть двоичные файлы, содержимое которых я пытаюсь прочитать в вектор. Все файлы имеют одинаковый размер, но при использовании моего кода ниже конечный векторный размер всегда немного меньше размера файла и отличается от файла к файлу (но то же самое для каждого файла). Я смущен тем, что здесь происходит...

#include <fstream>
#include <vector>
#include <iostream>
#include <iterator>
int main(int argc, char *argv[]) {
  std::string filename(argv[1]);

  // Get file size
  std::ifstream ifs(filename, std::ios::binary | std::ios::ate);
  int size = (int)ifs.tellg();
  std::cout << "Detected " << filename << " size: " << size << std::endl; // seems correct!

  // Load file
  ifs.seekg(0, std::ios::beg);
  std::istream_iterator<char unsigned> start(ifs), end;
  std::vector<char unsigned> v;
  v.reserve(size);
  v.assign(start, end);

  std::cout << "Loaded data from " << filename << ", with " << v.size() << " elements" << std::endl; 
}

Попробовав это в файле, я получаю следующее:

Detected foo_binary.bin size: 2113753
Loaded data from foo_binary.bin, with 2099650 elements

Число 2113753 - это правильный размер файла в байтах.

Попробовав это в другом файле того же размера, размер вектора будет содержать 2100700 элементов. Немного больше, но опять же не весь файл.

Что здесь происходит?

4b9b3361

Ответ 1

Существует несколько итераторов потоков. Шаблон класса std::istream_iterator<T> предназначен для форматированного ввода, т.е. Он пропускает ведущие пробелы перед тем, как попытаться прочитать объект типа T.

Из внешнего вида вы хотите std::istreambuf_iterator<char>, который используется для итерации над символами в файле, не выполняя никаких пропусков.