首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用C++ ifstream从文本文件中读取整数

使用C++ ifstream从文本文件中读取整数
EN

Stack Overflow用户
提问于 2011-11-14 10:56:41
回答 2查看 52.5K关注 0票数 19

我想从文本文件中读取图形邻接信息,并将其存储到向量中。

  • 文件有任意数量的行
  • 每行都有任意数量的以'\n'

结尾的整数

例如,

代码语言:javascript
复制
First line:
0 1 4
Second line:
1 0 4 3 2
Thrid line:
2 1 3
Fourth line:
3 1 2 4
Fifth line:
4 0 1 3

如果我使用getline()一次读取一行,我如何解析该行(因为每行都有可变数量的整数)?

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-14 11:03:03

标准的在线阅读习惯用法:

代码语言:javascript
复制
#include <fstream>
#include <sstream>
#include <string>
#include <vector>


std::ifstream infile("thefile.txt");
std::string line;

while (std::getline(infile, line))
{
  std::istringstream iss(line);
  int n;
  std::vector<int> v;

  while (iss >> n)
  {
    v.push_back(n);
  }

  // do something useful with v
}

下面是一个使用for循环的单行版本。我们需要一个辅助结构(致谢@Luc Danton!)这与std::move正好相反。

代码语言:javascript
复制
namespace std
{
  template <typename T> T & stay(T && t) { return t; }
}

int main()
{
  std::vector<std::vector<int>> vv;

  for (std::string line;
       std::getline(std::cin, line);
       vv.push_back(std::vector<int>(std::istream_iterator<int>(std::stay(std::istringstream(line))),
                                     std::istream_iterator<int>())
                    )
       ) { }

  std::cout << vv << std::endl;
}
票数 19
EN

Stack Overflow用户

发布于 2011-11-14 11:02:26

首先使用std::getline函数读取一行,然后使用std::stringstream从该行读取整数,如下所示:

代码语言:javascript
复制
std::ifstream file("input.txt");

std::vector<std::vector<int>> vv;
std::string line;
while(std::getline(file, line))
{
    std::stringstream ss(line);
    int i;
    std::vector<int> v;
    while( ss >> i ) 
       v.push_back(i);
    vv.push_back(v);
}

你也可以把循环体写成:

代码语言:javascript
复制
while(std::getline(file, line))
{
    std::stringstream ss(line);
    std::istream_iterator<int> begin(ss), end;
    std::vector<int> v(begin, end);
    vv.push_back(v);
}

这个看起来更短,也更好。或合并-最后两行:

代码语言:javascript
复制
while(std::getline(file, line))
{
    std::stringstream ss(line);
    std::istream_iterator<int> begin(ss), end;
    vv.push_back(std::vector<int>(begin, end));
}

现在不要让它变短,因为它会看起来很丑陋。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8116808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档