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

Nic*_*ung 4 c++ io fstream data-structures

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

第一行是这样的:

5 4 3 2 1

第二行是这样的:

1 2 3 4 5

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

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);
    }
Run Code Online (Sandbox Code Playgroud)

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

还以这种方式从文件中分配数字 5 5 4 3 2 1 1 2 3 4 5,所以它似乎在某处复制了额外的5,我不确定这是否是eof位.

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

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

Ker*_* SB 10

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

这是典型的演出:

#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
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,这种转换charint是很麻烦和脆弱.为什么不直接读取整数?

  int value;
  while (iss >> value) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

编辑:根据您的评论,这里是准确读取两行的代码:

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 */ }
}
Run Code Online (Sandbox Code Playgroud)