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

时间:2017-05-13 17:40:19

标签: c++ loops while-loop

我写了一个函数,它使用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)
}

1 个答案:

答案 0 :(得分:6)

  

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

没有

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

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

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