2013-04-12 5 views
0

Я пытаюсь перебирать в текстовый файл, используя итераторы:станд :: istream_iterator, потребление памяти

1) std::istream_iterator<MyData> itRecordStreamBegin(fileStream); 
2) std::istream_iterator<MyData> itRecordStreamEnd; 

После первой строки она читает некоторые данные из файла (он использует оператор >> для типа MyData). Как и ожидалось.

К сожалению, после этого потребление памяти увеличивается, и кажется, что istream_iterator попытался загрузить весь файл в память. Через несколько секунд (когда исключены исключения out_of_memory) отладчик попадает во вторую строку. Но чтение файла не удалось, и я больше ничего не могу прочитать.

Вопросы:

Является ли это правильное поведение для istream_iterator (для загрузки файла в память)?

Я не соблюдаю это для небольших файлов (например, 20 МБ).

Возможно, для такого большого файла мне нужно использовать обычный способ getline?

ответ

3

istream_iterator просто использует оператор >> на тип. Он содержит не более один экземпляр типа в памяти. При его использовании вы получаете do копии экземпляра. Я подозревал бы (но не видя кода), что либо ваш конструктор или деструктор копии неисправен, либо утечка памяти где-то в вашем операторе >>. Я был бы очень удивлен, если проблема связана с istream_iterator.

+0

Вы правы! Мне придется исследовать этот оператор >>. Спасибо за ответ – fen