读取/写入计算器的文件:atof错误

时间:2014-05-07 03:07:44

标签: c++ file-io visual-studio-2013

我目前有一个文本文件如下:

12 6 4 9 

这是一个非常简单的文本文件,因为我想让一行工作,然后可能会扩展到多行。额外的一边:这是我正在研究的RPN计算器。

我想逐个字符地浏览这个文本文件。我目前实现它的方式是使用简单的while循环:

string line;
while (!infile.eof()){
    getline(infile, line);

    if (isdigit(line[0])){
        rpn_stack.push_back(atof(line.c_str()));
    }
}

rpn_stack是一个向量,因为我不会在C ++中使用内置的堆栈库。 我目前遇到的问题是输出只是输出" 12"。这是为什么?

有没有一种方法可以逐个字符遍历文件而不是作为一行读取?它是否破裂,因为它找到了一个空白区域(会被认为是EOF)?


编辑:

代码已被重写为如下:

string line;

while (!infile.eof()){
    getline(infile, line);

    for (int i = 0; i < line.size(); i++){
        if (isdigit(line[i])){
            rpn_stack.push_back(atof(line.c_str()));
        }
    }
}

输出是12 5次不同的时间,这显然是错误的。 txt文档中不仅有4个项目,而且其中只有一个是12个。有人可以提供一些见解吗?

1 个答案:

答案 0 :(得分:1)

这将尽可能多地从double读取infile次(即直到文件结尾或直到它遇到不是double的标记),分开通过空白。

for (double d; infile >> d;)
  rpn_stack.push_back(d);

如果你需要逐行解析,正如@ooga所说,你需要一个看起来像这样的两阶段阅读器:

for (std::string line; getline(infile, line);) {

  std::istringstream stream{line};

  for (double d; stream >> d;)
    rpn_stack.push_back(d);
}

奖金提示:请勿使用.eof()