使用getline和istringstream从CSV文件中读取数据

时间:2015-05-20 14:35:48

标签: c++ ifstream getline

我正在尝试使用以下条目读取CSV文件:

//2009-12-31 21:00:00, COUNTRY ,1.84296,350.947,60.72

这就是我做的事情

#include <iostream>
#include <fstream>
#include <sstream>

int main()
{
    using namespace std;
    ifstream read("data.csv");

    string line;

    //I want to use this to hold the data temporarily
    string temp[5];

    while (std::getline(read, line))
    {
        int i=0;
        std::istringstream iss(line); // string stream
        while(std::getline(iss, temp[i], ','))
        {
            cout << i << ": " << temp[i] << endl;
            ++i;
        };
    }
}

但它没有做我想要的代码。特别是,代码在整数i命中后停止了21.这是输出

0: 2009-12-31 21:00:00
1: GRID_A
2: 1.84296
3: 350.947
4: 60.72
2010-01-01 00:00:00
5: GRID_A
6: 1.93569
7: 348.98
8: 60.64
2010-01-01 03:00:00
9: GRID_A
10: 2.30688
11: 339.444
12: 247.6
2010-01-01 06:00:00
13: GRID_A
14: 1.74453
15: 326.219
16: 587.92
2010-01-01 09:00:00
17: GRID_A
18: 2.16002
19: 289.19
20: 180.72
2010-01-01 12:00:00
21: GRID_A

然后我收到了这样的错误

_LIBCPP_INLINE_VISIBILITY
    static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
        {__c1 = __c2;}
Thread 1: EXC_BAD_ACCESS...
你可以告诉我有什么问题吗?非常感谢!

PS:事实证明问题与我在Mac上使用Excel保存的CSV文件有关。缺少换行符。

1 个答案:

答案 0 :(得分:2)

如果每行只有5列,则代码可以正常工作。如果i比4大,你会遇到问题。正如你所说,i是21!你的数组不能占用这么多元素。如果i超出数组范围,则应将循环保留在最后。

您尝试访问位于彩虹之外的temp[21]。难怪你得到了糟糕的访问权。

只需将temp用作单个字符串即可。如果您只想输出值,则无需数组。只需使用string temp;并在那里删除[i]