2010-11-04 86 views
0

我想知道为什么下面这段代码不起作用,看起来非常直截了当,我犯了一个错误吗?
这样做的结果是:文件已创建但为空,如果手动添加行,这些代码会显示这些行,但不会发生任何其他情况。使用std :: fstream读取/追加文件

#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

是你试图写东西到文件?这段代码没有这样做。 – birryree 2010-11-04 20:28:11

+0

什么'mfile <<“第1行\ n”;'当mfile是fstream时呢? – 2010-11-04 20:31:15

回答

2

几件事情:

当你准备写,你需要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”,这将触发缓冲区在OS的舒适文件的红晕......

+0

正确!旗帜是问题。 getlines之后的一个'clear()'解决了这个问题。 seekp并不是真的需要,因为我根本没有修改put ptr。我只是没有意识到有一个get ptr和一个put ptr。 :d – 2010-11-04 20:35:57