使用 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::getline
和 std::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 << " ";
}
我基本上是在处理这样一个文本文件的片段:
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::getline
和 std::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 << " ";
}