Как исключить повторяющиеся шаблоны кода при обработке строчно-ориентированных данных? - PullRequest
2 голосов
/ 24 мая 2019

Часто при обработке некоторых файлов данных, ориентированных на строки, я пишу такой код:

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
}

Приведенный выше пример иллюстрирует, что обработка группы непустых строк завершенапри встрече с пустой строкой или концом файла / потока.

Буду признателен за советы, как оптимизировать эту последовательность кода и избежать появления идентичного Finalization Code в коде ДВАЖДЫ ... или избегать проверки на eof дважды каждая итерация цикла.

PS
Я не хочу, чтобы Finalization Code запускался при возникновении аппаратной ошибки чтения - другими словами, ошибки eof и read не должны бытьсмешанный.

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

Вы можете отключить цикл только при ошибках не-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 три раза, но это дешево и несущественно по сравнению с обработкой, которую выполняет цикл.

0 голосов
/ 24 мая 2019

Как насчет этого:

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
    }
}

Это логический эквивалент вашего кода, но без дублированного кода вы получаете дублирующие условия в качестве компромисса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...