读取选项卡将文件分隔成c ++中的数组

时间:2013-11-14 22:25:39

标签: c++ arrays file tabs io

我的文件是这样的:

INT1 - 标签 - INT2 - 标签 - INT3 - 标签 - INT4 - 标签 - 换行符

INT1 - 标签 - INT2 - 标签 - INT3 - 标签 - INT4 - 标签 - 换行符

INT1 - 标签 - INT2 - 标签 - INT3 - 标签 - INT4 - 标签 - 换行符 ...

我想将每一行保存到一个数组中。我的意思是所有int1都在一个数组中,并且想要做同样的whit 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; } 

}

3 个答案:

答案 0 :(得分:3)

你有正确的想法使用字符串流。由于可能会再次使用读取分隔文件的代码,因此您可能会发现将其放入类中很有用。以下是我个人划分的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"]

答案 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个项目,此代码将崩溃。我会让你考虑一下。

答案 2 :(得分: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";
    }
}