首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取从文件到换行符的空格分隔数字

读取从文件到换行符的空格分隔数字
EN

Stack Overflow用户
提问于 2011-10-10 06:59:28
回答 1查看 21K关注 0票数 4

我有一个包含以下数据的文本文件。

第一行是这样的:

5 4 3 2 1

第二行是这样的:

1 2 3 4 5

我试图一次从一行读取数据,因为我的第一个链表对象将使用第一行的数据,而我的第二个链表对象将使用第二行的数据。我所能想到的最好的函数是:

代码语言:javascript
运行
复制
void polynomial::allocate_poly(std::ifstream& in, const char* file, const char* number)
{

    in.open(file);

    std::string str;
    char b;
    int m = 0;

    for(int i = 0; !in.eof(); ++i)
    {
        in >> b;
        m = b - '0';
        a.insert(m);
    }

这种方法有一些问题。我在for循环中尝试了不同的二元运算符,比如b == '\n',当b是换行符时,它们似乎都不会触发。

同样,以这种方式分配文件中的数字,它看起来像5 5 4 3 2 1 1 2 3 4 5,所以它似乎是在复制额外的5位,我不确定这是不是eof位。

我也尝试过使用getline函数,但由于某种原因,它似乎只复制了第一个整数,然后转储了文件的其余部分。我知道我肯定没有正确使用它,但我能找到的所有示例都是用于键入文件名,比如cin.getline,我希望在运行程序时能够将我的文件名作为命令行参数进行传递。

我的问题是,如何将第一行上的数字分配到换行符,然后将ifstream in变量传递给另一个对象以分配第二行?谢谢你的帮助。

EN

Stack Overflow用户

回答已采纳

发布于 2011-10-10 07:05:30

您没有说a是什么,但没关系:如果您想要基于行的解析,就需要在外部循环中使用getline。另外,永远不要使用eof,因为它不会做你想要的事情。而是使用到bool的隐式转换来检查操作是否成功。

下面是典型的演唱会:

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

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

while (std::getline(infile, line))  // this does the checking!
{
  std::istringstream iss(line);
  char c;

  while (iss >> c)
  {
    int value = c - '0';
    // process value
  }
}

但是,这种从charint的转换既麻烦又脆弱。为什么不直接读取一个整数呢?

代码语言:javascript
运行
复制
  int value;
  while (iss >> value) { /* ... */ }

编辑:根据您的评论,下面是读取两行代码的代码:

代码语言:javascript
运行
复制
std::string line;
int val;

if (std::getline(infile, line))
{
  std::istringstream iss(line);
  while (iss >> value) { /* process first line */ }
}
if (std::getline(infile, line))
{
  std::istringstream iss(line);
  while (iss >> value) { /* process second line */ }
}
票数 9
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7707143

复制
相关文章

相似问题

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