处理面向行的数据时如何消除重复的代码模式?

时间:2019-05-24 17:15:02

标签: c++ logic c++17

通常,当处理一些面向行的数据文件时,我发现自己正在编写这种代码模式:

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和读取错误混为一谈。

enter image description here

2 个答案:

答案 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三次,但这与循环所进行的处理工作相比是便宜且微不足道的。