从 fstream 对象中读取括号。C++

3

我用一个名为input的ifstream对象打开了一个.txt文件。如果一行以"("开头,则它不会按照我想要的方式读取。预期输出没有被打印,然后退出循环。我希望只有在到达文件结尾时才跳出while循环。我做错了什么?我的do while循环和.txt文件如下所示。

char c;
int i;
do
{
    if(input.peek( ) == '(' || input.peek( ) == ')')
    {
        input >> c;
        cout << c;
    }else if(input.peek( ) == '+' || input.peek( ) == '-' || input.peek( ) == '*' || input.peek( ) == '/')
    {
        input >> c;
        cout << c;
    }else
    {
        input >> i;
        cout << i;
    }

}while(input && input.peek( ) != EOF);

这是一个 .txt 文件,每行都是独立的。
(3)
(3)
4
(5+7)-(5*3)

这是我的输出:
 (3)3
1个回答

3
所以,我相当确定问题在于input.peek()在读取')'后返回一个换行符。然后input >> i;没有读取数字,i保留了之前的值,因此输出结果是3。您可以快速尝试通过在input >> i;之前添加i = 42;来验证 - 如果输出变成(3)42,那么我是正确的。
如果我是对的,您需要添加一些处理isspace()或类似内容的代码。
我还建议您在第一个if之前进行cpeek = input.peek();等操作,然后使用if (cpeek == '(' || cpeek == ')')...等等。

谢谢,那正是我需要的。你有如何处理换行符的建议吗?这是我现在的代码,但它仍然不能按照我想要的方式工作:if(input.peek() == '\n') {cout << endl; input >> c;}每行的第一个字符都丢失了。 - SirRupertIII
2
cin.ignore(); 或许?或者在这种情况下使用 cin.get(); 也可以。 - Mats Petersson
完美。你是最好的。我使用了input.ignore() - SirRupertIII

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接