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

reading and filling separate variables from file

本文关键字:单独 变量 填充 文件 读取      更新时间:2023-10-16

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

到目前为止,我认为第一行可以用,但我不确定如何让它读到每一行。每一行都是带有ID、名称和付款的记录。基本上,我想知道如何在处理完第一行之后跳到下一行。我还没有包括错误检查,但我认为它将在读取1条记录后的最后一个do-wile循环中。如果读取到每个变量中的信息是错误的,我可以检查它并将其输出到摘要文件或错误文件中。

void processFile()
{
string filename;
ifstream recordFile;
ofstream summary("summary.dat");
ofstream error("error.dat");
cout << "Please enter a filenamen";
do
{
cin >> filename;
recordFile.open(filename);
if (!recordFile.is_open())
cout << "No file by that name. Please enter another filenamen";  
}
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());
}

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

ifstream对象上使用getline函数

两件事。第一个是如果你必须阅读多个记录,并且每条记录都是一条新行,最佳解决方案几乎是始终使用std::getline逐行读取,然后使用std::istringstream将行(记录)分解为所需字段。这具有保持输入同步的优点,甚至如果出现错误;你不必担心skp领先多少或忽略。

第二点是,您正在检查eof()。这几乎总是一个错误;有时,它也会让你读一行在许多情况下,以及在其他情况下,忽略最后一行或字段。如果如果输入成功(并且您只能在尝试输入之后检查文件结尾),则流在条件语境;否则,它将表现为虚假。所以你的循环应该是:

std::string line;
while ( std::getline( recordFile, line ) ) {
std::istringstream record( line );
record >> ID;
if ( ! record ) ...
//  ...
}

最后一点:所有的CCD_ 6算子都去掉了前导空间,所以您不需要呼叫ws。另一方面,在上述情况下模式,您可能想做一些类似的事情:

if ( record >> ws && record.get() != EOF ) {
//  Unexpected garbage at end of line...
}

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