我正在使用此代码提取文本文件的每一行的某些部分:
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;
我得到了我需要的确切输出。我不明白有什么不同。
答案 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;
如果您需要cout
和fmatch
协议。
答案 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 );
...
}