我正在完成一项家庭作业,我们将从文件中读取公司数据,然后处理错误。
到目前为止,我认为我将使用第一行,但我不知道如何让它读取后的每一行。每行都是包含ID,名称和付款的记录。基本上我想知道在处理完第一行之后如何跳到下一行。我还没有包含错误检查,但我认为它将在读取1条记录后的最后一次while循环中。如果读入每个变量的信息是错误的,我可以检查它并将其输出到摘要文件或错误文件。
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());
}
*编辑:我发现了我的部分问题,我实际上需要跳过第一行并从那一点开始阅读。每个文件中的第一行都包含无用的数据。
答案 0 :(得分:1)
使用getline
对象
ifstream
功能
答案 1 :(得分:0)
两件事。首先,如果你将不得不阅读多个
记录,每条记录都是一条新线,最好的解决方案就是
始终使用std::getline
逐行阅读,然后使用
std::istringstream
将行(记录)分解为所需的行
领域。这样做的好处是可以保持输入同步
如果有错误;你不必担心前进多少
或忽略。
第二点是你正在检查eof()
。这差不多了
总是一个错误;有时,它会引导你读一行
许多,在其他情况下,忽略最后一行或字段。如果
输入成功(您只能在之后检查文件的结尾
尝试输入超出它),流将在a中表现为真
条件语境;如果没有,它将表现为假。所以你的循环
应该是:
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...
}
在循环的最后,验证没有额外的文本。