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

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

29.06.2019, 14:48. Показов 3669. Ответов 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 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
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 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru