将csv读入数组

时间:2014-01-13 16:10:48

标签: c++ arrays csv

我知道这个话题已经讨论了很多,但我仍然没有真正理解。不可否认,我对C ++编码很陌生,所以请放轻松我:)

无论如何:我有这个examplatory csv文件:

    ,313,315
91.5919,1.44421,1.74019
91.592,1.44254,1.73816
91.5921,1.43859,1.73336
91.5922,1.43449,1.73109

我需要一个先验未知维度的数组,因为csv将无法预测地扩展 - > x和y方向的动态数组。

这是我到目前为止所做的事情:

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    vector<vector<double> > values;
    vector<double> valueline;
    ifstream fin("in.csv");
    string item;
    for (string line; getline(fin, line); )
    {
        istringstream in(line);

        while (getline(in, item, ','))
        {
            valueline.push_back(atof(item.c_str()));
        }

        values.push_back(valueline);
        valueline.clear();
    }
}

它似乎正在完成这项工作,但如果我尝试输出数组或部分数据,我会得到奇怪的结果。例如cout&lt;&lt;值[0] [3]&lt;&lt; ENDL;收益率为1.63042e-322。值[0] [4]得到91.5919。 sizeof(values [0])也是24。

我做的事情我不应该在这里吗?

任何帮助都会很棒!感谢

2 个答案:

答案 0 :(得分:2)

尝试使用.at()运算符来查看您是否在向量的末尾读取? values[0][3]是第一行的第四个元素,在您的输入中不存在?

您可能想要这样做:

std::cout << values[3][0]; // Fourth line, first element;

std::cout << values.at(3).at(0); // Fourth line, first element;

向量上的索引运算符不进行边界检查。这是出于性能原因。你正在阅读界限,因此你得到了奇怪的数字。 at() throws a std::out_of_range exception.

答案 1 :(得分:1)

在向量上使用sizeof几乎没用 - 它告诉你顶级向量数据结构的大小(通常是两个size_t和一个指针),以字节为单位,这不是很糟糕有用。如果您想要矢量的大小,请使用size方法 - values[0].size()告诉您第一行有多少值。