通常,当处理一些面向行的数据文件时,我发现自己正在编写这种代码模式:
while (std::getline(infile, line))
{
if (line.compare(""))
{
//Process non-empty line
}
else
{
//Finalize processing a group of non-empty lines
}
}
if (infile.eof())
{
//Finalize processing a group of non-empty lines
}
上面的示例说明,遇到空行或文件/流末尾时,一组非空行的处理已完成。
我会建议您如何优化此代码序列,并避免在代码TWICE中出现相同的Finalization Code
...或避免在每次循环迭代中检查eof 两次。
P.S。
我不希望Finalization Code
在发生硬件读取错误时运行-换句话说,不应将eof和读取错误混为一谈。
答案 0 :(得分:0)
如何?
while (infile)
{
std::getline(infile, line);
if (infile && line.compare(""))
{
//Process non-empty line
}
else if (infile || infile.eof())
{
//Finalize processing a group of non-empty lines
}
}
这在逻辑上等同于您的代码,但是如果没有重复的代码,您将获得重复的条件作为权衡。
答案 1 :(得分:0)
您可以让循环仅在非EOF错误时中止,然后在处理非空行组之后在EOF上手动退出循环:
while (std::getline(infile, line) || infile.eof())
{
if (infile.eof() || line.compare(""))
{
// Finalize processing a group of non-empty lines.
}
else if (infile.eof())
{
// We're done.
break;
}
else
{
// Process non-empty line.
}
}
您要检查EOF三次,但这与循环所进行的处理工作相比是便宜且微不足道的。