2016-03-04 38 views
-2

我對C++很陌生。使用製表符分隔的文本填充字符串向量

我想用製表符分隔的文件中的元素填充矢量。什麼是最簡單的方法來做到這一點?

謝謝!

+0

提示:TAB的計數爲空格。從空白分隔的文本中讀取由'>>'操作符支持。 –

+1

微不足道的「Hi there!\ tfishbeen」我是兩個代幣還是三個?如果你必須處理這個問題,[std :: getline有一個重載,它允許你指定一個分隔符來代替行尾。](http://en.cppreference.com/w/cpp/string/ basic_string/getline)用'\ t''使用該超載並開始閱讀。 – user4581301

回答

0

有很多方法可以做到這一點,簡單的谷歌搜索給你一個解決方案。

這裏是來自my projects之一的示例。它使用getline並讀取逗號分隔文件(CSV),我讓你改變它來閱讀製表符分隔的文件。

ifstream fin(filename.c_str()); 
string buffer; 

while(!fin.eof() && getline(fin, buffer)) 
{ 
    size_t prev_pos = 0, curr_pos = 0; 
    vector<string> tokenlist; 
    string token; 
    // check string 
    assert(buffer.length() != 0); 

    // tokenize string buffer. 
    curr_pos = buffer.find(',', prev_pos); 

    while(1) { 

     if(curr_pos == string::npos) 
      curr_pos = buffer.length(); 

     // could be zero 
     int token_length = curr_pos-prev_pos; 

     // create new token and add it to tokenlist. 
     token = buffer.substr(prev_pos, token_length); 
     tokenlist.push_back(token); 

     // reached end of the line 
     if(curr_pos == buffer.length()) 
      break; 

     prev_pos = curr_pos+1; 
     curr_pos = buffer.find(',', prev_pos); 
    } 
} 

更新:改善條件。

+2

'while(!fin.eof())'有幾個問題,這裏最大的只是捕獲文件的結尾。我建議'while(getline(fin,buffer))'捕獲你可能關心的每個錯誤情況。 – user4581301

+0

@ user4581301謝謝,在最後加上缺失的行。 – vcp

+0

你不需要測試eof。它在'getline'之後的'fin'狀態中隱含着。在'while(getline(...))'中,getline返回流。 'while'用流的布爾運算符測試流。如果出錯,布爾運算符返回false。以下是關於幕後發生的一些問題:http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool – user4581301

0

這可能是最簡單的方法,但vcp的方法可以更高效。

std::vector<string> tokens; 
std::string token; 
while (std::getline(infile, token, '\t') 
{ 
    tokens.push_back(token); 
} 

完成。您實際上可以將其降至大約三行代碼,其中包括input iteratorback inserter,但爲什麼?

現在,如果文件被分割成行並由這些行上的製表符分隔,則還必須處理行分隔符。現在,您只需執行上述操作兩次,一次循環顯示行和一個內循環來解析選項卡。

std::vector<string> tokens; 
std::string line; 
while (std::getline(infile, line) 
{ 
    std::stringstream instream(line) 
    std::string token; 
    while (std::getline(instream, token, '\t') 
    { 
     tokens.push_back(token); 
    } 
} 

如果你需要做的線,然後標籤,然後...我不知道...引號?三個循環。但說實話,我可能正在看寫作a state machine。我懷疑你的老師在這個階段想要什麼。