从文件读取时c ++缺少数据

时间:2015-01-22 14:03:23

标签: c++

嗨,大家好惹你麻烦。我有两个问题。

  1. 我在打印出文件中的最后一个数据时遇到问题
  2. 如何只使用用户名
  3. 打印出某行开头

    数据:

    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”这是用户。谢谢!

2 个答案:

答案 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;
}

Live code here

  • 添加linestream.ignore(1);会忽略1个字符。否则,当您尝试阅读:之前的日期时,您最终会读取任何内容,因为第一个字符为:
  • 将data2更改为data1以获取名字
  • 要有条件地打印,请使用if之前的cout语句

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.