2013-12-16 3 views
0

Я довольно новичок в программировании на С ++, и у меня возникают проблемы с чтением из уже открытого файла. То, что я делаю, это писать в файл, читая его, добавляя к нему конец, а затем пытаюсь прочитать его снова, не закрывая исходный ifstream. Код выглядит следующим образом:Невозможно прочитать новую строку файла

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    ofstream myFile ("example.dat"); 

    // Open and write to file 
    if (myFile.is_open()) 
    { 
     myFile << "This is a line." << endl; 
     myFile << "This is another line." << endl; 
     myFile.close(); 
    } 
    else cout << "no"; 

    // Open and read from file 
    string line; 
    ifstream myFilein ("example.dat"); 
    if (myFilein.is_open()) 
    { 
     while (getline(myFilein,line)) 
     { 
      cout << line << myFilein.tellg() << endl; 
     } 
     //myFilein.close(); 
    } 

    // Open and add to end of file 
    if (!myFile.is_open()) 
    { 
     myFile.open("example.dat", ios::app); 
     myFile << "This is the last line." << endl; 
     myFile.close(); 
    } 

    //myFilein.open("example.dat", ios::ate); 

    // Read from already open file 
    myFilein.seekg(0, ios::beg); 
    if (myFilein.is_open()) 
    { 
     cout << "myFilein is open. " << myFilein.tellg() << endl; 
     while (!myFilein.eof()) 
     { 
      getline(myFilein, line); 
      cout << line << endl; 
     } 
    } 
    myFilein.close(); 

    int holdClose; 
    cin >> holdClose; 

    return 0; 
} 

Очевидно, что-то происходит не так, как tellg() возвращает значение -1 после первого чтения (то есть, после того, как он попадает в конец файла), но я «Не совсем уверен, почему он возвращает -1, так как я пытаюсь сбросить позицию до начала файла. Есть ли что-то, что мне не хватает или непонимание, как это работает? Если я закрою и снова открою файл, тогда все в порядке, но мне любопытно, есть ли способ продолжать читать, не закрывая его, если это имеет смысл. Спасибо за помощь :)

+4

Как только файл имеет флаги ошибок, например 'eof', вам нужно использовать' myFilein.clear() 'для их сброса, если вы хотите продолжить работу с файлом. –

+0

Вот и все! Спасибо, @RetiredNinja! –

ответ

0

Вы не очистили состояние потока, поэтому вызов seekg ничего не сделал. Вы должны добавить myFilein.clear() перед повторным размещением.

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