从文件中读取和填充单独的变量

时间:2012-10-09 16:29:04

标签: c++ file visual-c++ file-io file-processing

我正在完成一项家庭作业,我们将从文件中读取公司数据,然后处理错误。

到目前为止,我认为我将使用第一行,但我不知道如何让它读取后的每一行。每行都是包含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());
}

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

2 个答案:

答案 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...
}

在循环的最后,验证没有额外的文本。