fstream永远不会到达eof

时间:2015-02-06 18:04:14

标签: c++

我正在为类似lisp的语言编写翻译。输入文件是逐个令牌读取的。我在顶级std::fstream控制它,如下所示:

...
std::fstream fin(path, std::fstream::in);
symtable table; // aliased map<>

while (!fin.eof()) {
   try {
      std::cout << "file still has contents!" << std::endl;
      parse(fin, symbol_table);
   } catch (LexException le) {
      std::cout << le.what() << std::endl;
   } catch (ParseException pe) {
      std::cout << le.what() << std::endl;
   }
}

在我的词法分析器中,我处理前导空格并计算这样的行:

char ch;
while (fin >> std::noskipws >> ch) {
   if (ch == '\n') {
      line++;
      continue;
   } else if (isspace(ch)) {
      continue;
   }

   break;
}    

if (ch <= 32) {
    // return the "empty" token, as there's nothing grab from the file anymore
    return std::make_tuple("", -500);
}
// The rest is code which builds a token    

这也是事情变得奇怪的地方。

当我将此作为输入传递:()时,它很好,并且正好产生我想要的东西。

当我传入此作为输入:(时,我得到一个无限循环。

当我调试时,我发现(确实是作为令牌读入的。然后我的代码通过,读取Vim插入的换行符,然后进入无限循环,因为永远不会读取EOF。此外,我的std::cout声明从未打印过。

为什么会这样?为什么()可以正常使用,但(失败?

修改:对于一个帖子but is available on my github,完整来源太大。

0 个答案:

没有答案