Правило № 1 о чтении данных из файла: не доверяйте содержимому файла. Вы никогда не будете знать с абсолютной уверенностью, что находится в файле, пока не прочитаете его
Тем не менее, один правильный способ чтения строк данных из файла, где каждая строка состоит из нескольких полей, разделенных пробелами, заключается в использовании комбинации getline
и stringstream
:
std::string line;
while (std::getline(infile, line))
{
std::stringstream ss(line);
int a, b, c;
if (ss >> a >> b >> c)
{
// Add a, b, and c to their respective arrays
}
}
На английском языке мы получаем каждую строку из потока файлов, используя getline
, а затем анализируем строку на три целых числа, используя stringstream
. Это позволяет нам быть уверенным, что каждая строка отформатирована правильно.
Мы проверяем, чтобы извлечение целых чисел прошло успешно , прежде чем мы добавляем их в массивы, чтобы гарантировать, что массивы всегда имеют только действительные данные.
Существует другая обработка ошибок, которая может быть желательна:
- В этом примере, если не удается извлечь целые числа из строки, мы просто игнорируем эту строку; было бы неплохо добавить логику, чтобы прервать процесс или сообщить об ошибке.
- После того, как мы получим три целых числа, мы игнорируем оставшуюся часть строки; было бы неплохо добавить проверки, чтобы гарантировать, что в строке больше нет данных после требуемых целых чисел, в зависимости от того, насколько строгим должно быть форматирование файла.
- После того, как мы закончим чтение файла, мы должны проверить, что
eof()
установлено, а не fail()
или bad()
; если установлен один из этих двух флагов, при чтении файла произошла ошибка.