如何编写while循环以便读取整个文件,而不只是一行?

时间:2016-03-30 05:48:30

标签: c file stack

我有部分编写的代码,用于扫描后缀中充满数学表达式的文件,并将数字显示在屏幕上。

当它执行计算时,它只会读取一行然后退出。如何修改代码以测试文本文件中的所有算术表达式?

我已尝试命令代码在到达EOFNULL'\0'时退出,但它们都退出一行。

这是我的代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>

int top = -1;
float stack[500];

/* push the given data into the stack */
void push (int data) {
    stack[++top] = data;
}

/* Pop the top element from the stack */
float pop () {
    float data;
    if (top == -1)
        return -1;
    data = stack[top];
    stack[top] = 0;
    top--;
    return (data);
}

int main() {

    char str[500];
    FILE *p;
    if((p=fopen("testfile1.txt","r"))==NULL){
        printf("\n Unable to open file string.txt");
        return 1;
    }

    while(fgets(str,500,p)!='\0'){

        float data = -1, operand1, operand2, result;

        for (int i = 0; i < strlen(str); i++) {
            if (isdigit(str[i])) {
                /*
                 * if the i/p char is digit, parse
                 * character by character to get
                 * complete operand
                 */
                data = (data == -1) ? 0 : data;
                data = (data * 10) + (str[i] - 48);
                continue;
            }

            if (data != -1) {
                /* if the i/p is operand, push it into the stack */
                push(data);
            }

            if (str[i] == '+' || str[i] == '-'
                    || str[i] == '*' || str[i] == '/') {
                /*
                 * if the i/p is an operator, pop 2 elements
                 * from the stack and apply the operator
                 */
                operand2 = pop();
                operand1 = pop();
                if (operand1 == -1 || operand2 == -1)
                    break;
                switch (str[i]) {
                    case '+':
                        result = operand1 + operand2;
                        /* push the result into the stack */
                        push(result);
                        break;
                    case '-':
                        result = operand1 - operand2;
                        push(result);
                        break;
                    case '*':
                        result = operand1 * operand2;
                        push(result);
                        break;
                    case '/':
                        result = operand1 / operand2;
                        push(result);
                        break;
                }
            }
            data = -1;
        }
        if (top == 0)
            printf("Output:%3.2f\n", stack[top]);
        else
            printf("have given wrong postfix expression\n");
        return 1;
    }
}

另外,我需要读的方程是:

13 1 - 2 / 3 155 + *
100 100 100 100 + + +
10.33 2 2 2 2 2 * * * * *
30 10 - 10 - 10 - 2 *
300 13.25 - 11 3 - / 4 5 - * 3 /

它仅适用于第一个等式。我可以在循环结构方面做些什么来让它从文本文件中读出所有这些方程?

2 个答案:

答案 0 :(得分:4)

您的while循环结束:

    return 1;
}

这意味着它在读取第一行输入后从函数返回。

最合理的解决方法是完全删除return 1;。另一种选择可能是:

    if (top == 0)
        printf("Output:%3.2f\n", stack[top]);
    else
    {
        fprintf(stderr, "have given wrong postfix expression\n");
        return 1;
    }
}

然而,从第一个错误的交互式计算器退出是有点严厉。 (它从return离开main()后退出程序。)请注意,通常应在stderr上报告错误。回答错误的表达也许是一个好主意:

fprintf(stderr, "have given wrong postfix expression (%s)\n", str);

答案 1 :(得分:3)

代码看起来没问题,但在return循环中有一个for语句。此return语句将保留整个main函数。