如何跳过逗号来读取c ++中的信息

时间:2015-04-21 06:48:35

标签: c++

这是一项任务,我陷入第一次信息阅读过程中。 我需要从文件" bank.txt"中读取信息。 文件的每一行都是这样的: 稻(中国),13,2016-8-3,5kg

我写了一个cpp进行测试:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

struct Food
{
    string name;
    int quantity;
    string expireDate;
    string unit;
    bool selected;
};

void all(Food item[]);

int main()
{
    ifstream infile;
    Food bank[100];
    infile.open("bank.txt");

    string text, temp[400];
    string dummy;
    int num;
    stringstream linestream;

    while(infile.good())
    {
        for(int i = 0; i < 100; i++)
        {
            for(int j = 0; j < 4; j++)
            {
                getline(infile, text, ',');
                temp[4 * i + j] = text;
            }

            istringstream(temp[4 * i + 1]) >> num;
            bank[i].name = temp[4 * i];
            bank[i].quantity = num;
            bank[i].expireDate = temp[4 * i + 2];
            bank[i].unit = temp[4 * i + 3];
        }
    }

    all(bank);
    return 0;
}

void all(Food item[])
{
    for(int i = 0; i < 100; i++)
        cout << item[i].name << ".." << item[i].quantity << ".." << item[i].expireDate << ".." << item[i].unit << endl;
}

但是这会遇到一些问题,奇数行只显示名称。

如何修改我的代码以使其正常运行?

2 个答案:

答案 0 :(得分:1)

使用','作为getline的分隔符会在流中留下换行符。

相反,首先阅读整行,然后使用从中构建的stringstream来提取部分 (出于某种原因,你已经声明了一个似乎是这个的变量,但你永远不会使用它。)

string line;
if (getline(infile, line))
{
    istringstream linestream(line);
    for (int j=0;j<4;j++)
    {
        getline(linestream,text,',');
        temp[4*i+j]=text;
    }
    //...

还有while (infile.good())的问题,您不应该这样做 - 您可能需要重新构建代码。
this question and answers中了解更多相关信息(关于eof,但关于“好”和“坏”信息流的原则相同)。

答案 1 :(得分:0)

您还应该考虑新行

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

struct Food
{
    string name;
    int quantity;
    string expireDate;
    string unit;
    bool selected;
};

void all(Food item[], int count);

int main()
{
    ifstream infile;
    Food bank[100];
    infile.open("bank.txt");


    string text, temp[400];
    string dummy;
    int num;
    stringstream linestream;

    int i = 0;
    while (i < 100)
    {
        getline(infile, text, ',');
        if (!infile.good()) {
            break;
        }
        temp[4 * i] = text;
        for (int j = 1; j<3; j++)
        {
            getline(infile, text, ',');
            temp[4 * i + j] = text;
        }
        getline(infile, text, '\n');
        temp[4 * i + 3] = text;

        istringstream(temp[4 * i + 1]) >> num;
        bank[i].name = temp[4 * i];
        bank[i].quantity = num;
        bank[i].expireDate = temp[4 * i + 2];
        bank[i].unit = temp[4 * i + 3];
        i++;
    }

    all(bank, i);
    return 0;
}

void all(Food item[], int count)
{
    for (int i = 0; i<count; i++)
        cout << item[i].name << ".." << item[i].quantity << ".." << item[i].expireDate << ".." << item[i].unit << endl;
}