![]() |
|
Модераторы: bsa |
![]()
|
|
| Bugrimov |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 8.11.2012 Репутация: нет Всего: нет |
Доброе время суток. Нужен совет знающих людей.
Программа создает 2-а файла (one two). Вводимые данные записываются в файл one и потом преобразуя (М), записываются в файл two. Все бы хорошо, но меня смущают две буквы ЯЯ. Я ввожу 5-ть строк, а ЯЯ выводятся 6-й строкой. Подскажите как с этим бороться. Как я представляю это мусор выводимый на экран
|
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Буквы 'Я' - это символьное представление EOF.
Дело в том, что feof() сработает, только если до этого была попытка чтения за пределами конца файла:
feof() Вот представьте себе, что файл two.txt - пустой (нулевой длинны). Что выведет этот код:
Сразу после открытия файла (несмотря на то, что он пустой!) feof() не вернёт 1, потому не было попытки чтения, поэтому проваливаемся в тело цикла, где getc(pr) возвращает EOF, которое успешно печатается в виде буквы 'Я'. Нужно переделать логику программы, чтобы не печатать EOF. Это сообщение отредактировал(а) feodorv - 8.11.2012, 22:10 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| Bugrimov |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 8.11.2012 Репутация: нет Всего: нет |
Подскажите каким образом построить программу. Я понял, что это из-за feof.
|
|||
|
||||
| Riviero |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 25.3.2010 Репутация: нет Всего: 3 |
Можно так попробовать... Это сообщение отредактировал(а) Riviero - 9.11.2012, 08:24 |
|||
|
||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Вариантов масса, самый простой путь - использовать возвращаемое от getc значение:
То есть:
А после цикла, если это хоть кому-то интересно, можно провериться на возможную ошибку чтения:
так как getc может вернуть EOF не только в случае достижения конца файла. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
feodorv, у ТС ch объявлен как char, поэтому так проверять нельзя. В случае русской буквы 'я' программа блогополучно примет ее за конец файла. если бы ch был интом, тогда бы это работало. Если же ch объявить интом, то у ТС отвалятся другие части программы. По-хорошему нужно конечно переписывать всю программулину от начала, но лень матушка. а по сему, Bugrimov, проще всего в вашем случае сделать как сказал Riviero,
Ну и второй цикл также |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Ваша правда, volatile, не доглядел. Вообще, если функция возвращает int, то лучше в этот int и сохранять возвращаемое значение -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |