Ошибка чтения файла с постфиксным калькулятором

Я сделал калькулятор постфикса, и я почти уверен, что он работает, но это ошибка чтения. Калькулятор предназначен для чтения чисел в постфиксной записи из строки файла и их вычисления. Однако он не распознает строки, например, если у меня есть две строки, он объединит два выражения. У меня проблемы с чтением файлов, поэтому любая помощь будет оценена по достоинству. Извините за проблемы с форматом, это мой первый пост. Итак, вот мой код, чтобы лучше понять мою проблему.

import java.io.*;
import java.util.*;
import java.nio.charset.Charset;


public class PostfixCalculator {

private static final String ADD = "+"; 
private static final String SUB = "-";
private static final String MUL = "*";
private static final String DIV = "/";
private static final String EXP = "^"; 
private static final String NEG = "_";  //unary negation
private static final String SQRT = "#";

public void calculateFile(String fileName) throws IOException {
    BufferedReader br = null;
    StringBuilder sb = null;
    try {
        FileReader fileReader = new FileReader(fileName);
        br = new BufferedReader(fileReader);

        sb = new StringBuilder();
        String line = br.readLine();

        while (line  != null) {
            sb.append(line);
            line = br.readLine();
        }

        String input = sb.toString();
        System.out.println(input + " = " + calculate(input));
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        br.close();
    }


   } 

private double calculate(String input) {
    SinglyLinkedListStack<Double> stack = new SinglyLinkedListStack<Double>();

    String[] inputs = input.split(" ");

    return handleCalculation(stack, inputs);
}

private static double handleCalculation(SinglyLinkedListStack<Double> stack, String[] el) {
    double operand1, operand2;

    for(int i = 0; i < el.length; i++) {
        if( el[i].equals(ADD) || el[i].equals(SUB) || el[i].equals(MUL) || el[i].equals(DIV)||el[i].equals(EXP)||el[i].equals(NEG)||el[i].equals(SQRT)) {
            operand2 = stack.pop();
            operand1 = stack.pop();
            switch(el[i]) {
                case ADD: {
                    double local = operand1 + operand2;
                    stack.push(local);
                    break;
                }

                case SUB: {
                    double local = operand1 - operand2;
                    stack.push(local);
                    break;
                }

                case MUL: {
                    double local = operand1 * operand2;
                    stack.push(local);
                    break;
                }

                case DIV: {
                    double local = operand1 / operand2;
                    stack.push(local);
                    break;
                }
                case EXP: {
                    double local = Math.pow(operand1, operand2);
                    stack.push(local);
                    break; 

                }
                case NEG: {
                    double local = -(operand1);
                    stack.push(local);
                    break;
                }
                case SQRT:{ 
                    double local = Math.pow(operand1, .5);
                    stack.push(local);
                    break; 
                }

            }
        } else {
            stack.push(Double.parseDouble(el[i]));
        }
    }

    return (double)stack.pop();
}

}

Это мой связанный список

public class SinglyLinkedListStack<T> {

private int size;
private Node<T> head;

public SinglyLinkedListStack() {
    head = null;
    size = 0;
}

public void push(double local) {
    if(head == null) {
        head = new Node(local);
    } else {
        Node<T> newNode = new Node(local);
        newNode.next = head;
        head = newNode;
    }

    size++;
}

public T pop() {
    if(head == null)
        return null;
    else {
        T topData = head.data;

        head = head.next;
        size--;

        return topData;
    }
}

public T top() {
    if(head != null)
        return head.data;
    else
        return null;
}

public int size() {
    return size;
}

public boolean isEmpty() {
    return size == 0;
}

private class Node<T> {
    private T data;
    private Node<T> next;

    public Node(T data) {
        this.data = data;
    }

}


}

Это моя демонстрация

import java.io.IOException;

public class PostFixCalculatorDemo {
 public static void main(String[] args) throws IOException {
    PostfixCalculator calc = new PostfixCalculator();
    calc.calculateFile("in.dat");
}
}

Текстовый файл содержит

2 3 ^ 35 5 / -

1 2 + 3 * # 4 - 5 6 - + _

мой вывод 2 3 ^ 35 5 / -1 2 + 3 * # 4 - 5 6 - + _ = -8.0, как видно, он объединяет две строки. Я хочу, чтобы он читал две строки отдельно и вычислял 2 3 ^ 35 5 / - и 1 2 + 3 * # 4 - 5 6 - + _, не складывая их вместе. Я знаю, что это происходит, потому что я неправильно запрограммировал класс calculateFile, но я не уверен, как это исправить, не нарушая мою программу.


person masalaman    schedule 31.08.2017    source источник
comment
Где ошибка?   -  person shmosel    schedule 31.08.2017
comment
Ошибка в том, что он не может прочитать файл построчно   -  person masalaman    schedule 31.08.2017
comment
Это просто расплывчатое описание проблемы. Если есть ошибка, у вас должно быть сообщение об ошибке и трассировка стека. Разместите это здесь.   -  person shmosel    schedule 31.08.2017
comment
Возможный дубликат Чтение строки построчно в Java   -  person    schedule 31.08.2017
comment
Если в вашем коде есть ошибка, вам нужно описать ее более четко. Опубликуйте свой ввод, вывод, ожидаемый вывод и т. д.   -  person shmosel    schedule 31.08.2017


Ответы (1)


 while (line  != null) {
        sb.append(line);
        line = br.readLine();
    }

По сути, вы читаете каждую строку и добавляете ее к одному Stringbuffer, что приведет к объединению каждой строки из вашего файла. Этот буфер не будет содержать символ новой строки или любой другой знак, на котором заканчиваются ваши строки.

Из документации:

readline:

Читает строку текста. Строка считается завершенной одним из следующих символов: перевод строки ('\n'), возврат каретки ('\r') или возврат каретки, за которым сразу следует перевод строки.

Возвращает: строку, содержащую содержимое строки, не включая символы завершения строки, или null, если достигнут конец потока. Выдает:

Я советую добавлять строки в ArrayList, если вы планируете читать все сразу.

person Ervin Szilagyi    schedule 31.08.2017