在C++中将制表符分隔的文件读入数组

3
我有这样一个文件:
int1--tab--int2--tab--int3--tab--int4--tab--newline int1--tab--int2--tab--int3--tab--int4--tab--newline int1--tab--int2--tab--int3--tab--int4--tab--newline ...
我想将每一行保存到数组中。也就是说,所有的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; } 

}

不错的尝试。你知道总是有4列吗?你知道vector<int>吗? - Captain Giraffe
你的文件中的"--"是你添加的分隔符,还是文件中真的有"--"? - Paweł Stawarz
3个回答

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>

而 headers 是以下类型的别名:

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

并且应该有你的列名:

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

在我的示例中,我使用了字符串到字符串的映射,但你可以很容易地将其更改为:
typedef std::unordered_map<std::string,int>

使用这样的地图的好处在于代码自我记录:
row["column_1"]

1
这看起来相当合理。如果您知道列数,只需创建适当的数组并将它们添加即可:
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";
    }
}

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个项,此代码将崩溃。我会让你思考这个问题。

如果在列中出现空格怎么办? - marek094

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接