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

时间:2011-10-09 22:59:28

标签: c++ data-structures io fstream

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

第一行是:

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);
    }

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

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

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

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

1 个答案:

答案 0 :(得分: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
  }
}

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

  int value;
  while (iss >> value) { /* ... */ }

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

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 */ }
}
相关问题