Я делаю домашнее задание, где мы должны прочитать данные компании из файла, а затем обработать их на наличие ошибок.
Я думаю, что то, что у меня есть, будет работать с первой строкой, но я не уверен, как заставить ее читать каждую строку после. Каждая строка представляет собой запись с идентификатором, именем и платежами. В основном я хочу знать, как я могу перейти к следующей строке после того, как обработал первую. Я еще не включил проверку ошибок, но думаю, что это будет в последнем цикле do while после прочтения 1 записи. Если информация, прочитанная в каждую переменную, неверна, я могу проверить ее и вывести в сводный файл или файл ошибок.
void processFile()
{
string filename;
ifstream recordFile;
ofstream summary("summary.dat");
ofstream error("error.dat");
cout << "Please enter a filename\n";
do
{
cin >> filename;
recordFile.open(filename);
if (!recordFile.is_open())
cout << "No file by that name. Please enter another filename\n";
}
while(!recordFile.is_open());
int ID = 0;
string firstName;
string lastName;
double payment1, payment2, payment3 = (0.00, 0.00, 0.00);
string numberOfRecords;
getline(recordFile, numberOfRecords);
do
{
ws(recordFile);
recordFile >> ID;
recordFile >> firstName;
recordFile >> lastName;
recordFile >> payment1;
recordFile >> payment2;
recordFile >> payment3;
}
while(!recordFile.eof());
}
* edit: я нашел часть своей проблемы, мне нужно пропустить первую строку и продолжить чтение с этого момента. Первая строка в каждом файле содержит бесполезные данные.
Использовать getline
функция на ifstream
объект
Две вещи. Во-первых, если вы собираетесь читать несколько
записи, и каждая запись представляет собой новую строку, лучшее решение почти
всегда читать построчно, используя std::getline
, а затем использовать
std::istringstream
разбить строку (запись) на желаемое
поля. Это позволяет синхронизировать ввод, даже
в случае ошибок; вам не нужно беспокоиться о том, сколько впереди
или игнорировать
Второй момент заключается в том, что вы проверяете eof()
, Это почти
всегда ошибка; иногда это приведет вас к чтению одной строки
многие и в других случаях игнорируют последнюю строку или поле. Если
ввод успешен (и вы можете проверить только конец файла после
попытка ввода за его пределами), поток будет вести себя как истинный в
условный контекст; если нет, он будет вести себя как ложный. Так твоя петля
должно быть:
std::string line;
while ( std::getline( recordFile, line ) ) {
std::istringstream record( line );
record >> ID;
if ( ! record ) ...
// ...
}
И один последний комментарий: все >>
операторы убирают ведущие пробелы,
так что вам не нужен ваш звонок ws
, С другой стороны, с учетом вышеизложенного
схема, вы можете сделать что-то вроде:
if ( record >> ws && record.get() != EOF ) {
// Unexpected garbage at end of line...
}
в самом конце вашего цикла, чтобы убедиться, что нет лишнего текста.