Чтение и добавление из / в файл с помощью std :: fstream - PullRequest
0 голосов
/ 04 ноября 2010

Мне интересно, почему следующий фрагмент кода не работает, выглядит довольно просто, я ошибаюсь?
В результате получается: файл создан, но пуст, если я вручную добавлю строкис этим кодом показаны строки, но больше ничего не происходит.

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main(){
    fstream mfile("text.txt", ios_base::in | ios_base::out | ios_base::app);

    mfile.seekg(ios_base::beg);
    string line;
    while( getline(mfile,line) ){
        std::cout << line << "\n";
    }
    mfile.seekg(ios_base::end);

    mfile << "Line 1\n";
    mfile << "Line 2\n";
    mfile << "---------------------------------\n";

    mfile.seekg(ios_base::beg);
    while( getline(mfile,line) ){
        std::cout << line << "\n";
    }
    mfile.seekg(ios_base::end);

}

1 Ответ

2 голосов
/ 04 ноября 2010

Пара вещей:

Когда вы готовы писать, вам нужно seekp() вместо seekg(), т.е.

mfile.seekp(ios_base::end);

Теперь проблема в том, чтоgetline() звонки установят флаги потока (в частности, eof), и в результате поток не готов к дальнейшим операциям, вам нужно сначала очистить флаги!

попробуйте это:

string line;
mfile.seekg(ios_base::beg);
while( getline(mfile,line) ){
    std::cout << line  << endl;
}
mfile.seekp(ios_base::end); // seekp
mfile.clear(); // clear any flags

mfile << "Line 1" << endl; // now we're good
mfile << "Line 2" << endl;
mfile << "---------------------------------" << endl;

mfile.seekg(ios_base::beg);
while( getline(mfile,line) ){
    std::cout << line <<  endl;
}

Кроме того, используйте std :: endl вместо "\ n", это приведет к сбросу буферов в файл при удобстве ОС ...

...