C ++:将CSV文件读入struct数组

时间:2013-11-30 16:45:25

标签: c++ arrays file csv struct

我正在进行一项任务,我需要将未知行数的CSV文件读入结构化数组。只能通过C ++,而不是C(他们不希望我们将两者结合起来)。

所以,我有以下代码:

// DEFINITION
struct items {
    int ID;
    string name;
    string desc;
    string price;
    string pcs;
};

void step1() {

    string namefile, line;
    int counter = 0;

    cout << "Name of the file:" << endl;
    cin >> namefile;

    ifstream file;

    file.open(namefile);

    if( !file.is_open()) {

        cout << "File "<< namefile <<" not found." << endl;
        exit(-1);

    }

    while ( getline( file, line) ) { // To get the number of lines in the file
        counter++;
    }

    items* item = new items[counter]; // Add number to structured array

    for (int i = 0; i < counter; i++) {

        file >> item[i].ID >> item[i].name >> item[i].desc >> item[i].price >> item[i].pcs;

    }

    cout << item[1].name << endl;

    file.close();
}

但是当我运行代码时,应用程序会在阅读后返回空格,而我实际上认为它根本不会读取。以下是控制台中的输出:

Name of the file:
open.csv

Program ended with exit code: 0

2 个答案:

答案 0 :(得分:1)

您的第一个循环读取流。当没有其他东西可供阅读时它停止。此时,流进入故障模式(即std::ios_base::failbit被设置),它将拒绝读取任何内容,直到它以某种方式恢复。

您可以使用file. clear()将文件恢复为goid状态。然而,仅仅这一点无济于事,因为流仍在结束。你可以在阅读之前寻求开始,但我不会这样做。相反,我会一次性阅读该文件,并将push_back()每个元素读取到std::vector<items>

请注意,您对每个items记录的输入可能并不完全符合您的要求:如果您确实有CSV文件,则需要读取分隔符(例如{ {1}})并在读取ID后忽略分隔符。此外,您应该在阅读后始终测试流的状态。你的循环可以是看起来像这样:

,

确切需要什么取决于确切的文件格式。

答案 1 :(得分:0)

您的文件指针位于while循环后的文件末尾,以确定行数。在我看来,你已经清除并重置文件指针。此链接可能会对您有所帮助:http://www.cplusplus.com/forum/beginner/11564/