gpt4 book ai didi

C++ while循环从输入文件中读取

转载 作者:行者123 更新时间:2023-11-30 00:45:14 25 4
gpt4 key购买 nike

我编写了一个函数,使用 while 循环从输入文件中读取事务。我终其一生都无法弄清楚为什么它会两次阅读最后两行。使用时

 while(InFile){code}

根据我的理解,它将继续循环直到文件到达 EOF 标记。我不知道我哪里出错了。

void ProcessTransactions(Bank &acctList, string fileName)
{

Date transDate;
ifstream InFile;
InFile.open(fileName.c_str());
int month;
int day;
int year;
int acctNum;
int transAcctNum;
float amount;
string transType;

while(InFile)
{
InFile >> month >> day >> year;
transDate.SetDate(month, day, year);

InFile >> acctNum;
InFile >> amount;
InFile >> transType;
if(transType == "Transfer")
InFile >> transAcctNum;

cout << amount << endl;
}
}

输入文件

5 1 2012    1212    100.00  Deposit
5 1 2012 2323 100.00 Deposit
5 1 2012 3434 100.00 Deposit
6 1 2012 1212 200.00 Withdrawal
6 1 2012 2323 200.00 Withdrawal
6 1 2012 3434 50.00 Withdrawal
7 1 2012 1212 50.00 Transfer
2323
7 1 2012 2323 80.00 Transfer
3434
7 1 2012 3434 300.00 Transfer
1212
9 1 2012 1212 100.00 Deposit
9 1 2012 2323 100.00 Deposit
9 1 2012 3434 100.00 Deposit
10 1 2012 1212 300.00 Transfer
1212

输出

100
100
100
200
200
50
50
80
300
100
100
100
300
300 //** Why is this output twice ?

提取完最后一位数据后,文件标记应该已经到达 EOF,从而终止循环。

任何帮助将不胜感激!

============================================= ==========================附加说明/解决方案:从: Why is iostream::eof inside a loop condition considered wrong?

因为 iostream::eof 只有在读取流结束后才会返回 true。它并不表示下一次读取将是流的末尾。

考虑这个(并假设下一次读取将在流的末尾)

while(!inStream.eof()){
int data;
// yay, not end of stream yet, now read ...
inStream >> data;
// oh crap, now we read the end and *only* now the eof bit will be
set (as well as the fail bit)
// do stuff with (now uninitialized) data
}

反对:

int data;
while(inStream >> data){
// when we land here, we can be sure that the read was successful.
// if it wasn't, the returned stream from operator>> would be
// converted to false
// and the loop wouldn't even be entered
// do stuff with correctly initialized data (hopefully)
}

最佳答案

After it extracts the last bit of data, it the file marker should have reached EOF, terminating the loop.

没有。

当您尝试读取文件末尾过去 时设置EOF。此处您不检查提取是否成功,只是在您尝试提取之前检查流是否正常。因此,您将在最后获得额外的迭代。

你应该像这样循环(在 Stack Overflow 上有很多这样的例子,因为我们一直在告诉人们如何去做):

while (InFile >> month >> day >> year)

关于C++ while循环从输入文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43956124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com