Почему моя программа читает на одну строку меньше, чем есть на самом деле?И почему мой массив принимает только один? - PullRequest
0 голосов
/ 23 сентября 2019

В моём классе средней школы мне нужно прочитать текстовый файл с метками, а затем создать массив с этими метками (чтобы я мог ими манипулировать позже).Когда я пытаюсь прочитать количество строк в программе, она читает на одну единицу меньше, чем есть, а когда я вывожу массив, он состоит только из «1,00», записанных на количество строк, которые он посчитал (что неверно).

import java.awt.*;
import java.io.*;
import hsa.Console;

public class Assignment3Q3
{
    static Console c;
    public static void main (String[] args) throws IOException
    {
        c = new Console ();

        BufferedReader input = new BufferedReader (new FileReader ("marks.txt"));
        String mark = input.readLine ();
        int lines = 0;
        while (input.readLine () != null)
            lines++;
        input.close ();

        c.println (lines);

        double[] marks = new double [lines];
        int count = 0;

        BufferedReader input1 = new BufferedReader (new FileReader ("marks.txt"));


        while (input1.readLine () != null)
        {
            marks [count] = Double.parseDouble (mark);

            count += 1;
            if (count == lines)
            {
                break;
            }
        }

        for (int x = 0 ; x < lines ; x++)
        {
            c.println (marks [x]);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Почему это разделение в два этапа вообще?Это подвержено ошибкам.Нет значений в массиве marks над текущей строкой - count.Так что вместо этого храните двойники в динамически растущем ArrayList<Double> и выполняйте работу за один шаг.

0 голосов
/ 23 сентября 2019

Во втором цикле while вы всегда назначаете проанализированную версию переменной mark для элементов массива marks.Но вы установили переменную mark только один раз в своем коде, которая является первой строкой вашего файла.

В любом случае, не читая файл дважды (один раз, чтобы получить количество строк, а затем сохранить фактическую строкусодержимое), вы можете сделать это в одном цикле чтения, используя List вместо массива.

try (BufferedReader input = new BufferedReader (new FileReader("src/marks.txt"))) {
    List<Double> marks = new ArrayList<>();
    String line;
    while ((line = input.readLine()) != null) {
        marks.add(Double.parseDouble(line));
    }
    System.out.println(marks);
} catch (IOException e) {
    e.printStackTrace();
}

Если вы действительно хотите получить эти метки в массив, вы можете инвертировать вышеперечислите в массив следующим образом.

Double[] marksArray = marks.toArray(new Double[marks.size()]);

Также, как я делал в приведенном выше фрагменте кода, лучше использовать попробовать с подходом ресурсов при создании ресурсов AutoCloseable, таких как BufferedReaderили FileReader.Тогда вам не нужно закрывать их явно в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...