Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875

Чтение из файла. Почему используется цикл do-while?

29.06.2019, 14:48. Показов 3724. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В учебном примере для чтения из файла используется цикл do-while:
Java
1
2
3
4
5
int i;
do {
   i = fin.read();
   if(i != -1) System.out.print((char) i);
} while(i != -1);
Хотя, по моему блондинистому мнению, здесь целесообразней использовать обычный while, что позволит избавиться от лишней проверки на -1:
Java
1
2
3
4
5
int i = 0;
while(i != -1) {
   i = fin.read();
   System.out.print((char) i);
}
Я права? Или, как обычно, чего-то упускаю? Есть тут подводные камни?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.06.2019, 14:48
Ответы с готовыми решениями:

Цикл на чтение каждого файла в определенный массив
Добрый день ! В папке лежит какое-то кол-во файлов . в каждом файле неизвестное количество строк . Нужно их подгрузить в приложение...

Осуществить чтение из файла, цикл поиска в файле и переформатирование
чтение из файла цикл поиска в файле и переформатирование уважаемые программисты! есть текстовый файл test.txt со следующим...

Чтение текстовго файла. Почему-то получаются пустые значения
В общем объяснить немного сложно. Проще показать. Вот ссылка на проект. 2 раза кликните по листбоксу. 1 форма (main_form) скроется....

21
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
29.06.2019, 14:59
В вашем варианте, если файл изначально пуст, то будет выведен символ -1 ('?')

Добавлено через 56 секунд
(это неправильно, если что)

Добавлено через 2 минуты
В данном случае ваще нет разницы какой цикл использовать, дополнительную проверку в теле всё равно придётся делать
1
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.06.2019, 15:02
alicesmagic3d, Если я не ошибаюсь, то значение -1 вы получаете когда доходите до конца файла, и логично что вы сначала считываете а потом смотрите "а не конец ли?!"
В случае что ниже, вы получаете конец, То есть -1, пытаетесь его кастовать в char, а поскольку char всегда выше нуля то получаете наверное исключение.
1
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
29.06.2019, 15:08
К тому же вы инициализируете переменную i нулём прост для того, чтобы программа смогла войти в цикл. По вашему эт целесообразно?

Добавлено через 33 секунды
ViktorFX, не, исключение не вылетит

Добавлено через 4 минуты
Да, если значение отрицательное, то прост выводит знак вопроса
0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
29.06.2019, 15:08  [ТС]
А, ну да... на пустом файле работает некорректно.
Исключение не вылетает, но в консоль выводится вот это: 
Спасибо за ответы!
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.06.2019, 15:09
Gungala, а что будет? я в этих делах не силен, знаю что char начинается от нуля, и если везде используется do-while то значит так и надо. Везде так и незачем усложнять (даже если бы ничего не менялось) код который написан миллион раз, так даже читается легче.
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
29.06.2019, 15:11
Цитата Сообщение от ViktorFX Посмотреть сообщение
Gungala, а что будет?
Ну, у ТС выводит это: "", в онлайн компиляторе, в котором я проверял, просто вопросительный знак
0
29.06.2019, 15:15

Не по теме:

Gungala, у меня пока страница обновится проходит не мало времени. Часто так, ответ уже есть а я еще спрашиваю, сорян.

0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
29.06.2019, 15:25  [ТС]
Мало того, после возвращения цикла do-while на прежнее место и удаления цикла while, из пустого файла все равно выводится на консоль эта штука: 
И даже когда я добавляю в файл строку, например: I am a blonde
При чтении на консоль выводится: I am a blonde
Блин! Вот чего можно устроить шаловливыми ручонками.
Может кто-то объяснить, почему так происходит и как это убрать?

Добавлено через 2 минуты
После перезагрузки эклипса ничего не изменилось. Кракозябра вылезает немым укором

Добавлено через 2 минуты
Только после удаления файла и создания нового с таким же именем проклятье было снято.
В чем была причина порчи файла? Жутко интересно)
0
29.06.2019, 15:48

Не по теме:

Цитата Сообщение от alicesmagic3d Посмотреть сообщение
После перезагрузки эклипса ничего не изменилось. Кракозябра вылезает немым укором
Я тоже люблю поэкспериментировать, но вот после некоторых своих эксперивентов немного побаиваюсь, в некоторых случайх даже удаление/перезапись файлов не помогала (правда я использовал инструменты типа tomcat, и вроде надо было вручную искать какие-то там файлы и у них подчистить некоторые строки).
Цитата Сообщение от alicesmagic3d Посмотреть сообщение
В чем была причина порчи файла? Жутко интересно)
думаю тут проблема не в файле, возможно надо было очистить поток. Дождемся мнения тех что в теме.

0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
29.06.2019, 18:31
Лучший ответ Сообщение было отмечено alicesmagic3d как решение

Решение

Цитата Сообщение от alicesmagic3d Посмотреть сообщение
избавиться от лишней проверки на -1
Обычно делают так:

Java
1
2
3
4
int i = 0;
while((i = in.read()) != -1) {
   System.out.print((byte) i);
}
Ну, точнее, обычно никто вот так байтики по-одному руками не читает, но если хочется, то вот.

Добавлено через 4 минуты
Цитата Сообщение от alicesmagic3d Посмотреть сообщение
Мало того, после возвращения цикла do-while на прежнее место и удаления цикла while, из пустого файла все равно выводится на консоль эта штука: 
Потому что нужно читать, что метод возвращает, а не абы что писать. InputStream.read возвращает byte, а не char. Точнее int, чтобы можно было отличить -1 (EOF) от byte(128), ибо какому-то умнику пришло в голову сделать byte'ы в Java signed, но фактически там либо -1, либо byte. А byte нельзя просто взять и скастовать в char.
3
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
29.06.2019, 18:46  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Обычно делают так:

Java
1
2
3
4
int i = 0;
while((i = in.read()) != -1) {
   System.out.print((char) i);
}
Ну, точнее, обычно никто вот так байтики по-одному руками не читает, но если хочется, то вот.
Вау!!! Круто! А я все мозги ломаю как избавится от лишней проверки. Пыталась даже для инициализации найти "пустой" символ в юникоде... и не нашла. А оказалось вон как все просто решается

Добавлено через 4 минуты
Цитата Сообщение от ViktorFX Посмотреть сообщение
Везде так и незачем усложнять код который написан миллион раз, так даже читается легче.
Вот, ViktorFX, видите, что даже миллион раз написанный код можно так красиво упростить!

Добавлено через 10 минут
Цитата Сообщение от Gungala Посмотреть сообщение
К тому же вы инициализируете переменную i нулём прост для того, чтобы программа смогла войти в цикл. По вашему эт целесообразно?
Считаю, что да. Если в файле роман "Война и мир", то избавиться от лишней проверки на каждом байте очень даже целесообразно.
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
29.06.2019, 19:17
Цитата Сообщение от alicesmagic3d Посмотреть сообщение
.. избавиться от лишней проверки на каждом байте очень даже целесообразно.
И как, используя побайтовое чтение, избавится от проверки каждого байта?
В таком случае надо использовать буфер.
0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
29.06.2019, 19:32  [ТС]
Цитата Сообщение от ViktorFX Посмотреть сообщение
И как, используя побайтовое чтение, избавится от проверки каждого байта?
В таком случае надо использовать буфер.
Не меняя принципиальным образом учебный пример (использование буфера), улучшить код, избавившись от двойной проверки каждого байта.
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
29.06.2019, 19:38
Цитата Сообщение от alicesmagic3d Посмотреть сообщение
Считаю, что да. Если в файле роман "Война и мир", то избавиться от лишней проверки на каждом байте очень даже целесообразно.
Так чёрт возьми, вы ж ни от чего не избавились. То есть да, вы убрали второе условие, но теперь программа будет работать неправильно, поэтому что толку?
0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
30.06.2019, 00:07  [ТС]
Вот в этом варианте неправильно?
Java
1
2
3
4
int i = 0;
while((i = in.read()) != -1) {
   System.out.print((char) i);
}
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
30.06.2019, 00:09
alicesmagic3d, есть отличный способ проверить - запустить
0
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
30.06.2019, 00:20  [ТС]
Ну, ОК... запустите. У меня работает правильно.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.*;
class ShowFile {
    public static void main(String[] args) {
        FileInputStream fin;
        try {
            fin = new FileInputStream("test.txt");
        }
        catch (FileNotFoundException exc) {
            System.out.println("Файл не найден!");
            return;
        }
        try {
            int i = 0;
            while((i = fin.read()) != -1) {
               System.out.print((char) i);
            }
        }
        catch (IOException exc) {
            System.out.println("Ошибка при чтении файла!");
        }
        try {
            fin.close();
        }
        catch (IOException exc) {
            System.out.println("Ошибка при закрытии файла!");
        }
    }
}
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
30.06.2019, 02:21
Цитата Сообщение от alicesmagic3d Посмотреть сообщение
У меня работает правильно
Это пока в файле только ASCII-символы (0…127). Как только там будут символы вне этого диапазона (любая однобайтная локальная кодировка или любая кодировка UTF), то этот код сломается. Я же написал, что нельзя просто так кастовать в char.
2
 Аватар для alicesmagic
233 / 130 / 27
Регистрация: 24.08.2016
Сообщений: 875
30.06.2019, 03:58  [ТС]
Ээх.. жаль. Так красиво выглядело. Ну, зато узнала что-то новенькое (хоть и не особо поняла пока то, что узнала)
Спасибо!

Добавлено через 4 минуты
P.S. Gungala и ViktorFX мои извинения...

Добавлено через 5 минут
korvin_, но тогда же и исходный учебный пример (первый код в первом посте) сломается при выходе из диапазона? Так ведь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.06.2019, 03:58
Помогаю со студенческими работами здесь

Не могу понять, почему не идёт чтение из текстового файла на форму!
private void buttonOK_Click(object sender, EventArgs e) { StreamReader file = new StreamReader("Vopros i otveti na...

почему бесконечный цикл get() выводит последнюю букву много раз из файла
#include <iostream> #include <fstream> using namespace std; char pf = "C:\\Users\\User\\Desktop\\a.txt"; int main() { ...

Чтение из файла. Почему выравнивание по ширине ? Или как это назвать
class Formulation //постановка задачи { public: void Instruction() { string path =...

Как используется цикл в коде?
function getConten(){ for(var j = 1; j < 19; j++){ getPageContent(1 + 10*(j-1), "https://loftblog.ru/cms/page/" + j + "/"); }...

Для чего используется цикл for в данном коде
Здравствуйте, можете подсказать, для чего используется цикл "for", в данном коде? #include <iostream> #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru