使用 ifstream 处理制表符并将任意数量的值读入向量

Dealing with tabs with ifstream and reading an arbitrary number of values into a vector

我基本上是在处理这样一个文本文件的片段:

6
    Jane Doe
    1942
    90089
    3 1 5 12

第 2-5 行有标签。我试图将每个值保存在一个适当的变量中,我希望将底线上的数字存储在一个名为 friends 的向量中,例如<3、1、5、12>。最后一行可以有任意数量的数字。我也不知道我是否遗漏了有关 ifstream 如何处理选项卡的任何信息。

这是我目前的情况:

int id;
ifile >> id;
string name;
getline(ifile, name);
int year;
ifile >> year;
int zip;
ifile >> zip;
vector<int> friends;
// Not sure how to read in the vector if it has an arbitary length
// Use getline and somehow read everything in from the string?

我将如何处理向量? While 循环?

我认为通过std::getline读取每个字段使代码清晰易读。 在最后一行,使用 std::getlinestd::stringstream 读取一行,我们可以读取任意数量的数字,如下所示。 This post 会有帮助。

std::string buffer;

std::getline(ifile, buffer);
const int id = std::stoi(buffer);

std::string name;
std::getline(ifile, name);
name.erase(std::remove(name.begin(), name.end(), '\t'), name.end());

std::getline(ifile, buffer);
const int year = std::stoi(buffer);

std::getline(ifile, buffer);
const int zip = std::stoi(buffer);

std::getline(ifile, buffer);
std::stringstream ss(buffer);
std::istream_iterator<int> begin(ss), end; //defaulted end-of-stream iterator.
const std::vector<int> v(begin, end);

std::cout
    << "id:" << id << std::endl
    << "name:" << name << std::endl
    << "year:" << year << std::endl
    << "zip:" << zip << std::endl;

for(const auto& i : v){
    std::cout << i << " ";
}