Я пытаюсь прочитать в файле с 3 номерами с плавающей запятой в строке. Прямо сейчас, я это реализовано как:Правильно обрабатывать ввод, когда файл имеет меньше чисел, чем ожидалось
std::ifstream inFile(inName.c_str());
if (!inFile) {
prterr("in ASCII file could not be opened!\n");
return -1;
}
std::vector<double> xData, yData, zData;
xData.resize(nPoints);
yData.resize(nPoints);
zData.resize(nPoints);
inFile.precision(std::numeric_limits<double>::digits10+1);
for (int i = 0; i < nPoints; ++i) {
inFile >> xData[i] >> yData[i] >> zData[i];
inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
так, что программа успешно работает, даже если пользователь вводит более 3 числа в каждой строке. Однако иногда пользователь пытается запустить программу с < 3 номерами в строке. Когда это произойдет, анализатор, очевидно, сохранит данные некорректно.
Я хотел бы либо (а) выдаст ошибку, если файл имеет менее 3-х чисел в каждой строке, или (б) хранить только первые числа N в каждой строке в своих векторах, если только N чисел в строке присутствуют в файле. Фокус в том, что я хочу сделать это как можно быстрее, так как мои данные могут быть несколько ГБ. Мне может быть гарантировано, что мой файл имеет то же количество чисел в строке.
Есть ли изящный и эффективный способ выполнения (b)? Я знаю, что я мог бы реализовать (а), просто прочитав первую строку как строку отдельно перед циклом for, но это кажется довольно уродливым. Есть лучший способ сделать это?
Таким образом, весь файл может быть одним столбцом или двумя столбцами или тремя столбцами или N столбцами, но вы хотите хранить до трех столбцов? – NathanOliver
@NathanOliver Точно. В лучшем случае это то, что я хотел бы сделать. Если я не могу сделать это эффективно, тогда я всегда мог бы реализовать (а). – NoseKnowsAll