2014-10-15 4 views
1

Я использую «getline» для чтения некоторых строк в текстовом файле. Он работает так, как должен, но я вызываю метод несколько раз.Чтение текстового файла из первой строки несколько раз (C++)

while(getline(file, line)) 
{ 
    //Do something 
} 

//More code in between 

while(getline(file, line)) 
{ 
    //Do something else 
} 

Проблема заключается в том, что, когда я называю «GetLine» во второй раз, он начинает читать, откуда он ранее закончил (например, если первый, пока цикл заканчивается на второй линии, то следующий цикл начинается в третьей строке) , Как я могу гарантировать, что моя программа каждый раз читает файл с первой строки?

+1

http://stackoverflow.com/questions/5343173/returning-to-beginning-of-file-after-getline – Yann

+4

Почему вы делаете это? Почему бы не сохранить линию, как только вы ее прочитали? Во всяком случае, ответ находится в потоке, связанным с Yann4. – jrok

+0

Это вернет вас к началу: 'file.clear(); file.seekg (0); ' – Galik

ответ

7

Если вам нужно то же первая линия несколько раз я думаю, вы должны пересмотреть ваш стратегия.

  1. Просто прочитайте строку один раз.
  2. Сохраните его в переменной (или просто сохраните в переменной «строка», которую у вас уже есть).
  3. Закрыть файл.

Вы бы избежать много не нужных операций ввода/вывода ...

Тем не менее, как и другие люди предложили, если по какой-либо причине вы хотите procede с этим подходом, вам нужно вставить:

myinputstream.clear();    //clear the buffer 
myinputstream.seekg(0, ios::beg); //reset the reading position to beginning 

между каждой попыткой прочитать один и тот же файл. И не забудьте закрыть его в конце концов.

myinputstream.close(); 
+0

Что делать, если у него массивный файл и нужно найти разные строки по разным причинам в разное время? – Galik

+0

Вопрос четко задан, так что это должен быть комментарий, а не ответ. –

+0

@ Xarylem: в методе уценки, используемом на сайте, когда вы хотите упорядоченный список, напишите dot ('.') после каждого числа вместо' -'. – GingerPlusPlus

3

Там есть функция seekg(), которая должна помочь http://www.cplusplus.com/reference/istream/istream/seekg/

iostream::seekg (0, iostream::beg); 

переместит вас на самом начале потока

+1

Я думаю, что вам также может понадобиться сначала очистить флаги ошибок потока в некоторых случаях. – Galik

+0

Несомненно, пользователь должен помнить, что флаги ошибок не будут сброшены сами по себе. –

+0

иногда мы открываем файл для чтения, а другой процесс открывает его для записи ... поэтому мы обновляем его, открывая его более одного раза. да, конечно, мы переходим к началу файла после каждого чтения, потому что конец чтения означает достижение EOF. так: myinputstream.clear(); // очистить буфер myinputstream.seekg (0, ios :: beg); // сбрасываем позицию чтения до начала – Raindrop7