2012-11-21 103 views
0

我是一個新手,當涉及到C++,我想要做的是從.csv文件讀取,並將其存儲在向量中,然後顯示,我的問題是代碼崩潰後,最後reqd條目從終端運行時顯示從文件,但在ide(codeblocks)它說sigsegv錯誤,當我嘗試調試它...代碼段錯誤

ps:我想要讀取文件到載體的原因是能夠稍後進入mysqldb

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

using namespace std; 
vector<string> split_at_commas(const string& row) 
{ 
    vector<string> res; 
    istringstream buf(row); 
    string s; 
    while (getline(buf, s, ',')) 
     res.push_back(s); 
    return res; 
} 

int main() 
{ 
    string line; 
    ifstream data("Book1.csv" ,ios::out); 
    while(!data.eof()) 
    { 
     getline(data,line,'\n'); 
     vector<string> v = split_at_commas(line); 
     /*ide points error to this line*/ 
     cout << v[0] << '\t' << v[1] <<'\t' << v[2]<< '\t'<<endl;     
    } 
    data.close(); 
} 
+4

你的代碼縮進很糟糕,你應該感覺很糟糕。請修復 –

+2

你可以發佈你的數據文件 - 你可能有一行沒有三列,所以你試圖訪問一個不存在的元素。 –

+1

最有可能的是,你的最後一個記錄少於3個值,這使'v [2]'違反了數組的邊界。 – 2012-11-21 11:35:15

回答

1

不能保證'v'包含三個或更多個元素。在調用split_at_commas之後和在調試器中打印之前檢查'v'的內容,以驗證v是否擁有3個或更多項目。

+2

或者更好的是,使用迭代器遍歷每個條目。這樣,您將只打印儘可能多的實際條目。 – fayyazkl

+0

偉大的一般方法,絕對是一個很好的選擇。我認爲他的輸入文件每行總是有三個字,所以如果v中有任何內容,它將是三個元素。對於其他情況,你的建議甚至更好。 – Gaminic

+0

@fayyazkl謝謝很多人我只是把輸出在一個循環,它的工作原理,循環如下 'for(unsigned int i = 0; i user1841645