嗨,大家好惹你麻烦。我有两个问题。
数据:
tom12:Miscellaneous:-30.52:20JAN15
ben23:Utility Bill:-56.50:17JAN15
tom12:Child Needs:-80.95:15JAN15
tom12:Baby needs:-20.9:18JAN15
ben23:Phone Bill:-35.90:12JAN14
ben23:Housing Bill:-192.88:01JAN15
代码:
string line;
ifstream file("expenses.txt");
double totalNegative = 0;
double totalPositive = 0;
while(getline(file, line))
{
stringstream linestream(line);
string data1;
string data2;
double data3;
string data4;
getline(linestream, data1, ':');
getline(linestream, data2, ':');
linestream >>data3;
getline(linestream, data4, ':');
cout << data2 << " $" << data3 << " " << data4 << " "<< endl;
}
结果:
Miscellaneous $-30.52
Utility Bill $-56.50
Child Needs $-80.95
Baby needs $-20.9
Phone Bill $-35.90
Housing Bill $-192.88
结果缺少最后一列的日期。我如何只打印出“tom12”这是用户。谢谢!
答案 0 :(得分:2)
将您的代码更改为
{
stringstream linestream(line);
string data1;
string data2;
double data3;
string data4;
getline(linestream, data1, ':');
getline(linestream, data2, ':');
linestream >>data3;
linestream.ignore(1); // ignore ':'
getline(linestream, data4, ':');
cout << data1 << " $" << data3 << " " << data4 << " "<< endl;
}
linestream.ignore(1);
会忽略1个字符。否则,当您尝试阅读:
之前的日期时,您最终会读取任何内容,因为第一个字符为:
if(data1 == "tom12") cout << data1 << " $" << data3 << " " << data4 << " "<< endl;
答案 1 :(得分:1)
在
linestream >>data3;
你仍然有一个冒号加上流中的最后一个标记。例如,在第一行的情况下
tom12:Miscellaneous:-30.52:20JAN15
你在流中留下的是
:20JAN15
因为你消耗了所有内容,包括-30.52
。在这种状态下,
getline(linestream, data4, ':');
将在下一个:
之前提供所有内容,这是空字符串。
根据您想要处理畸形数据的方式,有几种方法可以解决它;也许最简单的是
getline(linestream, data4, ':'); // consume that colon (and possibly things left before it)
getline(linestream, data4); // then take the rest of the line.