2014-01-13 99 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()會告訴您第一行有多少個值。