2014-01-13 3 views
0

나는 주제가 많이 논의되었다는 것을 알고있다. 그러나 나는 아직도 그것을 얻지 않는다. 틀림없이 내가 C++ 코딩에 아주 새로운 오전, 그래서 나를 쉽게 이동하십시오 :배열로 csv를 읽는 것

을 여하튼 : 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 

내가 알 수없는 차원 사전 배열을 필요 :이 examplatory 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 < < 값 [0] [3] < < endl; 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; 

색인 사업자가 경계 검사를하지 않습니다. 이것은 성능상의 이유로 사용됩니다. 너는 범위를 읽으므로 이상한 숫자를 얻는다. 벡터에 sizeof를 사용 at() throws a std::out_of_range exception.

1

는 대부분 쓸모가 - 그것은 당신에게 정말 유용하지 않습니다 바이트의 최상위 벡터 데이터 구조 (일반적으로 두 가지 size_t들과 포인터)의 크기를 알려줍니다. 벡터의 크기를 원하면 size 메서드를 사용하십시오. values[0].size()은 첫 번째 줄에 몇 개의 값이 있는지 알려줍니다.