3

我有这样的文件:

int1--tab--int2--tab--int3--tab--int4--tab--换行

int1--tab--int2--tab--int3--tab--int4--tab--换行

int1--tab--int2--tab--int3--tab--int4--tab--换行...

我想将每一行保存到一个数组中。我的意思是所有 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

3 回答 3

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 std::unordered_map<std::string,std::string>

headers 是一个 typedef:

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

并且应该有你的列名:

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

在我的示例中,我使用了字符串到字符串的映射,但您可以轻松地将其更改为:

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

使用这样的地图的好处是自我记录的代码:

row["column_1"]
于 2013-11-14T22:43:32.637 回答
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";
    }
}
于 2013-11-14T22:46:23.610 回答
0

奇怪的是,你已经完成了困难的部分,却被困在我看来容易的部分。

只需将aand替换b为数组和索引即可。

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

于 2013-11-14T22:43:51.067 回答