istream getline()可以工作一点......然后休息

时间:2012-04-08 17:19:44

标签: c++

我有一个文本文件,其中有一串用换行符分隔的数字,如下所示: 123.25 95.12 114.12等...

问题是,当我的程序读取它时,它只将数字复制到数组,直到第二个数字,然后用零填充其余元素。我尝试过使用分隔符并忽略语句,但没有任何效果。这是代码。

编辑(这是整个程序:)

#include <iostream>
#include <string.h>
#include <iomanip>
#include <fstream>

using namespace std;


struct utilityInfo
{
    char utility[20];
    double monthlyExpenses[12];
};

int main(){

utilityInfo Utility[3];

char charray[100];

fstream inFile;  
inFile.open("expenses.txt");
inFile.getline(charray, 7);
cout<<charray<<endl;
if(inFile.fail()) cout<<"it didnt work";

for(int i=0; i<12; i++)
{
    inFile.getline(charray,20);
    Utility[0].monthlyExpenses[i]=atof(charray);
}

for(int z=0; z<12; z++)
{
cout<<Utility[0].monthlyExpenses[z]<<endl;
}

inFile.close();


return 0;
} 

这是文本文件的样子:

207.14 
177.34
150.55
104.22
86.36
53.97
52.55
58.77
64.66
120.32
153.45
170.90

以下是输出结果:

207.14
177.34
0
0
0
0
0
0
0
0
0
0

1 个答案:

答案 0 :(得分:1)

你文件中的第一个条目,“207.14”实际上是“207.14” - (那里有一个空格)。你读了7个字符,但在那里留下了“”,这意味着istream :: getline在inFile上设置了failbit,这意味着你的连续getline失败了。

要解决这个问题,请仔细阅读以获取换行符,删除空格和/或在第一个getline后清除inFiles failbit。

您还应该在for循环中添加一个检查,以处理fail / bad / eof位可能出现的任何错误。