在循环中写入文件(std :: ofstream)只写入最后一行

时间:2013-09-06 15:15:23

标签: c++ file parsing file-io ofstream

我正在使用此代码提取文本文件的每一行的某些部分:

std::ifstream file( "infile.txt" );
std::string in1, out1;
int blockNumber = 0;

while( getline( file, in1 ) ) 
{   
    int n = 0;
    int i = 0;

    while( i <= blockNumber )
    {   
        n = in1.find_first_of("(", n + 1); 
        i++;
    }   
    out1 = in1.substr( n + 1, ( in1.find_first_of(")", n) - n - 1) );  
    ofstream fmatch ("solo_matches.txt",ios::out);
    fmatch.close();
    fmatch.open("solo_matches.txt");
    fmatch << out1;
    fmatch.close();
} 

但是当我运行代码时,结果并不像我预期的那样。只有最后一个字符串被写入该文件。如果我改用它:

 std::cout << out1 << std::endl;

我得到了我需要的确切输出。我不明白有什么不同。

3 个答案:

答案 0 :(得分:5)

好吧,每次打开时,ofstream可能会覆盖现有内容。我的意思是,每次打开文件时,写指针都会被放置在begninning中,所以即使没有ios::trunc标志,写入该文件的新数据也会覆盖现有内容。

要解决此问题,请为每行文本停止重新打开两次流。文件打开操作可能很慢。

或者尝试使用ios::app标志。

答案 1 :(得分:2)

在循环中移动文件打开和文件关闭操作:

#include<iostream>
#include<fstream>

int main()
{
    std::ifstream file( "infile.txt" );
    std::string in1, out1;
    int blockNumber = 0;
    std::ofstream fmatch ("solo_matches.txt",std::ios::out);

    while( getline( file, in1 ) ) 
    {   
        int n = 0;
        int i = 0;

        while( i <= blockNumber )
        {   
            n = in1.find_first_of("(", n + 1); 
            i++;
        }   
        out1 = in1.substr( n + 1, ( in1.find_first_of(")", n) - n - 1) );  
        //fmatch.close();  //you don't need this
        //fmatch.open("solo_matches.txt"); //you don't need this
        std::cout << out1 << std::endl;
        fmatch << out1 << std::endl;
    }   
    fmatch.close();
}

并替换

fmatch << out1;

fmatch << out1 << endl;

如果您需要coutfmatch协议。

答案 2 :(得分:1)

std::ofstream fmatch("solo_matches.txt", ios::out);
fmatch << ...;
fmatch.close();

打开文件,重写其内容并在关闭流时保存。要将内容附加到文件末尾,您可以使用ios::app标志:

std::ofstream fmatch("solo_matches.txt", ios::out | ios::app);

或更好,而不是在每次迭代中重新打开文件:

while (...) {
    construct ofstream
    write to file
    close ofstream
}
你可以这样做:

construct ofstream
while (...) {
    write to file
}
close ofstream

另请注意这一行:

out1 = in1.substr( n + 1, ( in1.find_first_of(")", n) - n - 1) ); 

依赖于输入的正确格式,检查find_first_of的返回值会更安全:

std::size_t pos = in1.find_first_of(")", n);
if (pos != std::string::npos)
{
    out1 = in1.substr( n + 1, pos - n - 1 );
    ...
}