2013-11-14 38 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"; 
    } 
} 
相关问题