2010-08-21 5 views
1

У меня возникают проблемы с инструкцией getline от fstream. это фрагмент из моего кода:getline возвращает пустую строку

 

boolean_1=true; 
while(true) 
{ 
    if(boolean_1) 
    { 
     //some stuff 
    } 
    else 
    { 
     save_file.open("save.txt", fstream::in); 
     //some stuff 
     save_file.close(); 
    } 

    mission_file.open(filename, fstream::in); 
    mission_file.getline(buffer_line, 256); 

    //some other stuff 

    boolean_1=false; 
    save_file.open("save.txt", fstream::out); 
    //write something 
    save_file.close();  
} 
 

Этот код должен открыть mission_file первый раз, когда он работает, и откройте файл сохранения на следующей итерации. Файл сохранения создается в конце каждого цикла. По крайней мере, он должен работать следующим образом. Потому что в первый раз все работает безупречно, но на следующей итерации «mission_file.getline (buffer_line, 256)»; возвращает пустую строку, что приводит к сбою программы. Кроме того, если boolean_1 запускается как false, цикл работает нормально до следующего.

Я уже проверил наличие требуемых «.txt», и файл mission_file, и save_file возвращают is_open() true.

+0

Вы, кажется, не проверяете, будет ли 'getline' успешным, по-видимому, вы хотите остановиться после достижения последней строки? –

+0

«getline» терпит неудачу только тогда, когда я уже загрузил файл mission_file, выполнил все необходимые действия и затем снова открыл его в начале следующего цикла. Это не сработает, когда я открою его в первый раз, и я пропустил из этого фрагмента код для остановки перед EOF. – Tibor

+0

Это очень помогло бы, если бы ваш образец кода был полным и компилируемым (хотя и минимальным). Прямо сейчас мы видим, что у вас есть переменная, называемая 'mission_file', но вы не показываете, где и как она объявлена, или все соответствующие операции, которые вы выполняете на ней. –

ответ

2

Невозможно увидеть из выдержек кода, которые вы опубликовали, но похоже, что вы повторно используете один и тот же объект std::fstream для каждого цикла.

Было бы яснее создать новый локальный объект внутри цикла в точке, в которой вам нужно повторно открыть файл.

Если вы хотите повторно использовать тот же объект fstream, чтобы открыть новый файл (или тот же файл в другое время), перед чтением из нового файла вы должны очистить флаги ошибок потока.

Выполнение clear в некоторый момент до первого чтения из нового файла должно сделать это.

mission_file.clear() 
+0

Большое спасибо, .clear() разрешил все :)! – Tibor

0

Вы убедитесь, что mission_file закрывается, потому что я не вижу mission_file.close(). Или вы просто пропустили эту строку в фрагменте кода здесь.

+0

Извините, я забыл поставить mission_file.close() в фрагменте, так или иначе, он находится в коде. – Tibor

Смежные вопросы