2014-01-13 64 views
0

我知道这个话题已经讨论了很多,但我仍然没有真正了解它。诚然我是很新的C++编码,所以请去容易对我:)将csv读入数组

总之:我有这个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 < < values [0] [3] < < end1;产量1.63042e-322。值[0] [4]产生91.5919。 sizeof(值[0])也是24.

我在做什么,我不应该在这里?

任何帮助将是伟大的!谢谢

回答

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

在载体上使用sizeof是大多无用 - 它告诉你在字节顶层矢量数据结构(通常为两个size_t S和一个指针),这还不是特别有用的大小。如果您需要矢量的大小,请使用size方法 - values[0].size()会告诉您第一行有多少个值。