Member 13842147 Ответов: 2

Я хочу прочитать (пример) шаблон что-то вроде "@123@123@123" из файла. После встречи с @, 123 нужно сохранить в массиве и так далее.


Мой фактический файл для чтения - это что-то вроде:
@
1
2
.
.
90
@
1
2
.
.
90
@
1
.
.
90
@
Я хочу прочитать файл, когда @ встречается, данные (здесь целые числа) после @ должны быть прочитаны в массив. Затем, после того как данные будут переданы в массив, возобновите чтение файла, когда @ снова встретится, повторите процесс и снова сохраните следующий набор данных после @ в массиве.

Что я уже пробовал:

Я попробовал этот код,который дает мне ошибку. Я не понимаю, в чем ошибка. Пожалуйста, помогите мне. Строка кода, которая показывает ошибку, находится ниже:
public void P()
        {
            while(s.hasNext())
            {
            String lineOfText = s.nextLine();
            if (lineOfText.startsWith("@"))
            
                
            {
            
            }
            
			codes[m] = s.nextInt();
			m++;
            
            }
		
        }

Когда у меня есть только
@
1
2
.
.
90
в файле код работает нормально. Но мой файл-это шаблон, подобный описанному выше iv'e. Пожалуйста помочь.

Richard MacCutchan

"Я попробовал этот код,который дает мне ошибку."
Какая ошибка?

Member 13842147

Исключение в потоке "main" java.util.Исключение InputMismatchException

Richard MacCutchan

Очевидно, вы пытаетесь извлечь int из строки текста, содержащей нечисловые символы (например, полная остановка). Посмотрите более внимательно на ваши входные данные и код для каждого возможного случая.

Member 13842147

В коде, включенном iv'e, если следующая строка начинается с @, то выполните требуемую операцию. @ - это как маркер. Когда @ встречается, перейдите к следующей строке, прочитайте данные и отобразите их. Затем, когда встретится следующий @, повторите этот процесс.

Richard MacCutchan

Да, но вы предполагаете, что каждая вторая строка содержит число. Ошибка говорит вам, что вы прочитали строку, которая не является числом.

Member 13842147

Я только что еще раз проверил свое досье. Файл просто содержит числа от 1 до 90, разделенные символом"@".

Richard MacCutchan

Но ваш код неверен. Вы читаете строку текста, а затем вызываете nextInt, который читает следующую строку. Итак, вы упускаете некоторые цифры. Вам нужно прочитать каждую строку по порядку и обработать ее в соответствии с тем, содержит ли она @ или нет.

2 Ответов

Рейтинг:
19

Richard MacCutchan

Попробовать это:

while(s.hasNext()) {
    String lineOfText = s.nextLine();
    if (lineOfText.startsWith("@")) {
        // ignore lines starting with @
    }
    else {
        codes[m] = Integer.parseInt(lineOfText);
        System.out.println("num: " + codes[m]);
        m++;
    }
}


Member 13842147

Это прекрасно работает. Он отображает 1-90 в сетке. Как мне заставить его отображать следующий набор 1-90 ? Я пытаюсь понять, почему я могу отображать только первые 1-90, а не остальные, пожалуйста, объясните. Я постараюсь исправить то, что делаю неправильно.

Richard MacCutchan

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

Member 13842147

На самом деле я хочу прочитать 256 байт данных из файла, затем отобразить их в сеточном формате, затем после задержки в несколько секунд прочитать следующие 256 байт, затем отобразить их в сеточном формате и так далее, где я буду использовать '@' для разделения каждых 256 байт. Прежде чем сделать это, сначала я хотел попробовать это со случайными числами.

Рейтинг:
1

OriginalGriff

Посмотри на свой код.
Что произойдет, если строка, которую Вы читаете, начинается с"@"? Что он делает, если это так? А что будет, если это не так? Тут, если ничего делать на практике?

И сделайте себе одолжение: внимательно посмотрите на свой входной файл с помощью текстового редактора (а возможно, и двоичного средства просмотра): здесь вы описываете два очень разных формата в одном и том же вопросе, и данные не могут быть обоими!


Member 13842147

Содержимое файла таково:
@
1
2
.
.
90
@
1
2
.
.
90
@
1
.
.
90
@
Когда он сталкивается с@, он должен перейти к следующей строке и прочитать все данные, пока не встретит следующий@, и сохранить их в массиве, а после задержки снова продолжить тот же процесс.

OriginalGriff

И что же? Что делает ваш код?

Member 13842147

Когда я изменяю содержимое файла только на:
@
1
2
.
90
он читает и отображает содержимое в сеточном формате, как я хочу.
Но когда я пытаюсь использовать фактическое содержимое файла, которое я описал ранее, это дает мне ошибку InputMismatchException.