2013-11-14 69 views
2

我有文件是這樣的:讀取製表符分隔文件到在C++數組

INT1 - 標籤 - INT2 - 標籤 - INT3 - 標籤 - INT4 - 標籤 - 換行符

int1 - tab - int2 - tab - int3 - tab - int4 - tab - 換行

int1 - tab - int2 - tab - int3 - tab - int4 - 標籤 - 換行 ...

我想將每一行保存到一個數組中。我的意思是所有INT1到一個數組,並希望做同樣的白衣INT2 INT3 ......

我真的不知道該怎麼做了,請幫我

我已經嘗試一行一行地讀它

#include <sstream> 
#include <string> 

std::string line; 
while (std::getline(infile, line)) 
{ 
    std::istringstream iss(line); 
    int a, b; 
    if (!(iss >> a >> b)) { break; } 

} 
+0

不是一個壞的嘗試。你知道總是有4列嗎?你知道矢量? –

+0

是您的文件中的「 - 」是您添加的用於說明的分隔符,還是文件中確實存在「 - 」? –

回答

3

你有正確的想法使用stringstream。由於讀取分隔文件的代碼很可能會再次使用,因此您可能會發現將它放入類中非常有用。下面是從我個人的分隔的FileReader類的摘錄:

bool FileReader::getrow(RowMap &row){ 
    std::string line = ""; 
    if(std::getline(filehandle,line)){ 
     std::stringstream line_ss(line); 
     std::string column = ""; 
     unsigned int index = 0; 
     while(std::getline(line_ss,column,delimiter)){ 
      if(index < headers.size()){ 
       row[headers[index]] = column; 
       index++; 
      } 
      else{ 
       break; 
      } 
     } 
     return true; 
    } 
    return false; 
} 

凡RowMap是一個typedef:

typedef std::unordered_map<std::string,std::string> 

和標頭是一個typedef:

typedef std::vector<std::string> RowHeadersVector; 

,應該有你的列名稱:

RowHeadersVector headers; 
headers.push_back("column_1"); 

在我的例子,我使用的地圖串來串的,但你可以很容易地將其更改爲:

typedef std::unordered_map<std::string,int> 

使用地圖像這樣的好處是自我記錄代碼:

row["column_1"] 
0

奇怪的是,你已經完成了困難的一部分,並被困在我看來很容易的部分。

只需用數組和索引替換ab即可。

int a[100], b[100]; 
int count = 0; 
std::string line; 
while (std::getline(infile, line)) 
{ 
    std::istringstream iss(line); 
    if (!(iss >> a[count] >> b[count])) { break; } 
    ++count; 
} 

在此循環結束時count會告訴您已添加到陣列的項目數。當然,如果您嘗試向數組添加超過100個項目,則此代碼會崩潰。我會讓你考慮一下。

+0

如果一列中出現空白,該怎麼辦? – marek094

0

這看起來相當合理。如果你知道列的數量,你可以創建合適的陣列並添加它們:

std::vector<int> array, barray, carray, darray; 
std::istringstream lin; 
for (std::string line; std::getline(infile, line);) { 
    lin.clear(); 
    lin.str(line); 
    if (lin >> a >> b >> c >> d) { 
     aarray.push_back(a); 
     barray.push_back(b); 
     carray.push_back(c); 
     darray.push_back(d); 
    } 
    else { 
     std::cout << "WARNING: failed to decode line '" << line << "'\n"; 
    } 
} 
相關問題