0

我正在做一项家庭作业,我们要从文件中读取公司数据,然后对其进行处理以查找错误。

到目前为止,我认为第一行可以使用,但我不确定如何让它读取之后的每一行。每一行都是一个包含 ID、姓名和付款的记录。基本上我想知道在处理完第一行之后如何跳到下一行。我还没有包括错误检查,但我认为它将在读取 1 条记录后的最后一个 do 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());
}

*编辑:我发现了我的问题的一部分,我实际上需要跳过第一行并从那一点开始阅读。每个文件的第一行包含无用的数据。

4

2 回答 2

1

在对象上使用getline函数ifstream

于 2012-10-09T16:41:31.120 回答
0

两件事情。第一个是如果您要读取多条记录,并且每条记录都是一个新行,最好的解决方案几乎总是逐行读取,使用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...
}

在循环的最后,验证没有多余的文本。

于 2012-10-09T17:00:13.310 回答