Я все еще озадачен тем, почему эта программа не дает результат, который я ожидаю - PullRequest
0 голосов
/ 24 июня 2018

Я до сих пор не могу понять, почему эта программа не вычисляет и выдает результат, который, как я думал, будет.

Я пытаюсь использовать экземпляр класса PrintWriter для записи нескольких значений с плавающей запятой, указанных пользователем в цикле for, в текстовый файл, названный пользователем как Numbers.txt.

Затем я создал объект inputFile класса Scanner и использовал метод hasNext для чтения этих значений в цикле while, в котором они вычисляются и результат присваивается переменной total; аккумулятор, инициализированный до 0.0.

Тем не менее, значение общей переменной по-прежнему равно 0,0, а не суммированию этих значений с плавающей запятой в файле.

Я новичок в Java, в частности, и в программировании в целом, поэтому кто-нибудь, пожалуйста, помогите мне определить, где произошла ошибка и как ее исправить, чтобы получить желаемый результат.

Заранее спасибо! Ниже приведен фрагмент кода, который я написал:

public class FileSum {
   public static void main(String[] args) throws IOException {
      double individualValues, total = 0.0; // total is an accumulator to store the sum of the values specified in Numbers.txt, thus it must be initialized to 0.0
      int numberOfValues;

      Scanner kb = new Scanner(System.in);

      System.out.print("enter the file name: ");
      String fileName = kb.nextLine();

      System.out.print("enter the number of floating-point values in the file: ");
      numberOfValues = kb.nextInt();

      PrintWriter outputFile = new PrintWriter(fileName);

      for(int i = 1; i <= numberOfValues; i++) {
          System.out.print("the floating-point value number " + i + ": ");
          individualValues = kb.nextDouble();
          outputFile.println(individualValues);
      }

      File file = new File(fileName);
      Scanner inputFile = new Scanner(file);

      while(inputFile.hasNext()) {
          individualValues = inputFile.nextDouble();
          total = total + individualValues;
      }

      inputFile.close();
      outputFile.close();
      kb.close();

      System.out.println("the total values in Numbers.txt: " + total);
  }}

Вот вывод программы:

введите имя файла: Numbers.txt

введите число значений с плавающей точкой в ​​файле: 2

число с плавающей точкой 1: 4,5

значение с плавающей запятой 2: 3.2

общие значения в Numbers.txt: 0,0

1 Ответ

0 голосов
/ 24 июня 2018

Похоже, вы пытаетесь прочитать некоторые значения из System.in, записать их в файл, затем прочитать этот файл и добавить числа.

Однако, поскольку вы не закрываете файл, который выпишите до конца программы, вы не можете быть уверены, что содержимое файла сбрасывается в файл, когда вы читаете файл.Таким образом, вы, вероятно, inputFile.hasNext() всегда возвращаете false

Просто переместите строку outputFile.close(); вверх в своем коде, чтобы это произошло до того, как вы создадите Сканер для нового Файла, тогда у вас все получится!Файл будет записан, и вы сможете открыть его для чтения.

Дальнейшее объяснение Это связано с тем, что PrintWriter не автоматически сбрасывает свой вывод при вызове println.Он остается в буфере по соображениям производительности.Есть другие конструкторы, которые принимают логическое значение autoFlush.Если установлено значение true, оно сбрасывает значения, которые вы записали в файл.Вызывая close, вы сбрасываете все, что ожидает записи, а затем добавляете все ресурсы, связанные с этим открытым файлом.

...