Я пытаюсь перебрать текстовый файл с помощью итераторов:
1) std::istream_iterator<MyData> itRecordStreamBegin(fileStream);
2) std::istream_iterator<MyData> itRecordStreamEnd;
После первой строки он читает некоторые данные из файла (он использует оператор >> для типа MyData). Как и ожидалось.
К сожалению, после этого потребление памяти растет, и кажется, istream_iterator
попытался загрузить весь файл в память. Спустя несколько секунд (когда генерируются исключения out_of_memory) отладчик попадает во вторую строку. Но чтение файла не удалось, и я больше ничего не могу прочитать.
Вопросы:
Это правильное поведение для istream_iterator
(загрузить файл в память)?
Я не наблюдаю это для небольших файлов (например, 20 МБ).
Может быть, для такого большого файла мне нужно использовать общий getline
путь?
istream_iterator
просто использует >>
оператор по типу. Это держит максимум один экземпляр типа в памяти. При его использовании вы делать сделать копии экземпляра. Я бы заподозрил (но не увидев код), что либо ваш конструктор копирования, либо деструктор неисправен, или вы теряете память где-то в вашем >>
оператор. Я был бы очень удивлен, если проблема связана с istream_iterator
,
Других решений пока нет …