Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.95
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
#1

"я" это EOF?! - C++

23.04.2010, 16:50. Просмотров 4773. Ответов 12
Метки нет (Все метки)

У меня получился такой прокол - прога читает текст из файла, циклом, посимвольно, и букву "я" принимает за EOF! Догадываюсь, это идёт от того, что Ctrl+Z символ EOF. Как это обойти, подскажите, плз!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2010, 16:50     "я" это EOF?!
Посмотрите здесь:

Заменить всякое вхождение слова "это" на слово "то" - C++
Заменить каждое вхождение слова "это" на слово "то". Прошу помощи! #include <iostream> #include <Windows.h> #include...

Обработка .txt кодировка ANSI и UTF-8 (буква "я" в ANSI воспринимается как EOF) - C++
Есть следующий кусок кода: FILE* fp = fopen("G:\OPND1.txt", "r"); if (fp!=NULL) // если файл удалось открыть { while((ch =...

Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd" - C++
вот код, нужно найти 3 минимальных положительных числа в массиве. При размере массива больше 950 в конце заполнения рандомным способом...

Как это работает (недокументированное использование оператора "запятая")? - C++
Нашёл один велосипед в сети, можете объяснить как это работает? Что это за недокументированное использование оператора "запятая"? ...

Первый комом (Вывести "Это моя первая С++ программа.") - C++
Привет! Начал изучать С++ недавно. Классная штука! В книге был пример, который нужно повторить. Простенький код /* Программа №1 -...

Запутался с #include "..." и Linker, как это работает ??? - C++
Всем привет, (1) Я не могу до конца понять, как подключить библиотеку .lib или .obj к моей программе. Итак, пусть в моей...

QT собирается четвертый час, "зависнув" на одном месте. Это нормальн? - C++
Проблема в названии темы. Решил попробовать QT, скачал, выполнил, как положенно, "configure", после чего ввел "nmake". В мануале, по...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
23.04.2010, 18:58     "я" это EOF?! #2
Открывай файл в бинарном режиме.
Day
1154 / 959 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
23.04.2010, 19:24     "я" это EOF?! #3
AlexRyzhenko, Странно это. Всю жизнь читал из файла посимвольно, никогда такого не встречал.
EOF - это -1
Ты читаешь через getc ?
А кому присваиваешь? Надо - int-у, его проверять на EOF, а уж потом этот int класть в char.
Попробуй.

Добавлено через 3 минуты
CheshireCat, бинарный тут скорее всего ни при чем. Текстовой от него отличается только тем что , перевод строки с возвратом каретки объединяет в один символ
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
23.04.2010, 21:27  [ТС]     "я" это EOF?! #4
Day, спасибо! Работает! А что можно без преобразования присваивать элементу строки значение переменной int?

Добавлено через 1 час 43 минуты
А с другим кимпилятором опять тоже самое...
Day
1154 / 959 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
23.04.2010, 21:44     "я" это EOF?! #5
Цитата Сообщение от AlexRyzhenko Посмотреть сообщение
Day, спасибо! Работает! А что можно без преобразования присваивать элементу строки значение переменной int?
Конечно!
Это прописано в самом начальном (K&R) определении С
Могуть быть потеряны знаки, но в данном случае мы-то знаем, что все будет ОК.

А с другим кимпилятором опять тоже самое...
Любопытно, с какими кимпиляторами ты работал?
Вообще-то там могут самые разные чудеса.
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
24.04.2010, 09:47  [ТС]     "я" это EOF?! #6
Ещё один прикол в том что MinGW всё норм, а в MinGW Developer Studio - эти чудеса. А мне в курсовой желательно обойтись без чудес... Больше попробывать негде.. BDS2009 - один большой глюк. Можно ставить большую Я, но как-то странно выглядит тогда.

Добавлено через 11 часов 23 минуты
Рабочий вариант такой - проверять не
C
1
с != EOF
а
C
1
!feof(f)
. Тогда, вроде на "я" не спотыкается!
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
24.04.2010, 13:44     "я" это EOF?! #7
Цитата Сообщение от AlexRyzhenko Посмотреть сообщение
Day, спасибо! Работает! А что можно без преобразования присваивать элементу строки значение переменной int?
Проблема вовсе не в том, можно или нельзя присваивать. Проблема в том, что ты работаешь, судя по всему, через функции типа fgetc. Эта функция должна уметь делать две вещи: возвращать текущий прочитанный байт (коих может быть 256 различных значений) и возвращать признак конца файла (ещё одно значение). Итого функция должна уметь возвращать 257 различных значений. Количество этих значений не влезает в тип char, а потому функция возвращает int. Эта одна из распространённых ошибок новичков - результат функции читают в переменную типа char, а не int. int'овое к конечном итоге трактуется так, что значений 0-255 соотвествуют байту, а специально выделенное значение EOF (которое обычно равно -1 или, что то же самое, 0xffffffff) кодирует признак окончания файла

Цитата Сообщение от AlexRyzhenko Посмотреть сообщение
Ещё один прикол в том что MinGW всё норм, а в MinGW Developer Studio - эти чудеса. А мне в курсовой желательно обойтись без чудес... Больше попробывать негде.. BDS2009 - один большой глюк. Можно ставить большую Я, но как-то странно выглядит тогда.
Ещё одно типичное свойство начинающих: не разобравшись, что и как должно работать, начинают обвинять компилятор, разработчиков компилятора, операционную систему, Билла Гейтса. Короче, кого угодно, но только не себя самого

Добавлено через 2 минуты
Цитата Сообщение от AlexRyzhenko Посмотреть сообщение
Рабочий вариант такой - проверять не
Пример вот здесь Загрузка картинок в формате .jpg и .gif
Всё работает. Только в твоём случае строку 6 заменить на что-то типа "printf ("%c", ch);" (а строку 3, соотвественно, выкинуть)
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
24.04.2010, 15:00  [ТС]     "я" это EOF?! #8
Evg, что-то Вы понаписали непонятно что. Во-первых, я читаю просто getc(). Во-вторых, что конкретно Вы хотели, сказать про EOF, я не понял. В-третих, никого я не объвиняю. Им на мои обвинения чихать, да и мне от этого не легче. Вы знаете в чём различия, тогда просветите! Воду лить все умеют. И пречём тут буква "я", Вы тоже, по-моему не знаете. А она причём, сто пудов.
Day
1154 / 959 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
24.04.2010, 15:29     "я" это EOF?! #9
Цитата Сообщение от AlexRyzhenko Посмотреть сообщение
Evg, что-то Вы понаписали непонятно что. Во-первых, я читаю просто getc(). Во-вторых, что конкретно Вы хотели, сказать про EOF, я не понял.
Ну, это только тебе непонятно
Тебе дали очень подробное и грамотное объясненение механизма, а ты еще чем-то недововолен.
Учись!
а. Скромности и уважению к людям, которые поболее твоего знают.
б. Программированию
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
24.04.2010, 15:59  [ТС]     "я" это EOF?! #10
Day, да я согласен, но разве с "я" и различиями комляторов стало понятней? Если мне не стало, я так и говорю "мне не понятно". Проехали.
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
24.04.2010, 16:04     "я" это EOF?! #11
Цитата Сообщение от AlexRyzhenko Посмотреть сообщение
Вы знаете в чём различия, тогда просветите!
Выше я обо всём подробно написал

Цитата Сообщение от AlexRyzhenko Посмотреть сообщение
И пречём тут буква "я", Вы тоже, по-моему не знаете. А она причём, сто пудов.
Буква "я" имеет код 255 (0xff В 16-ричном виде). EOF имеет код -1 (0xffffffff в 16-ричном виде). Если результат функции getc (fgetc) записать в переменную типа char, то в переменной окажется значение 0xff. Далее ты это значение сравниваешь с EOF (c == EOF). EOF имеет тип int, поэтому переменная типа char перед выполнением сравнения будет приведена к типу int, т.е. 0xff при расширении до int'а превратится в 0xffffffff, что совпадёт со значением EOF

Добавлено через 1 минуту
Цитата Сообщение от AlexRyzhenko Посмотреть сообщение
В-третих, никого я не объвиняю
ну-ну...

Цитата Сообщение от AlexRyzhenko Посмотреть сообщение
BDS2009 - один большой глюк
AlexRyzhenko
0 / 0 / 0
Регистрация: 29.07.2009
Сообщений: 119
24.04.2010, 16:27  [ТС]     "я" это EOF?! #12
Спасибо. Теперь понятно с "я". Но MinGW DS и с int'ом не распознаёт эту букву... Но это ладно, выше я привёл нормальный вариант.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2010, 16:36     "я" это EOF?!
Еще ссылки по теме:

При создании MessageBox'a первой выделяется кнопка "ОК", как это поменять? - C++ WinAPI
День всем добрый! if (atoi(char_new_random) >= 15) { random = atoi(char_new_random); } else if (MessageBox(main_hWnd, ...

У меня в задании "Parser xml нужно реализовать самостоятельно." - это как? - C++
Плиз объясните новичку, с чего начинать.

хочу попробовать всунуть "for (int j=0; j<5; j++)" в cin. Как это можно реализовать? - C++
int main() { const int Mass =5; int a; for (int j=0; j&lt;5; j++) { cout &lt;&lt; &quot;-&gt;&quot;; cin &gt;&gt; a; ...

"динамически выделяет массив указателей на базовый класс" - как это понять? - C++
Что значит вообще массив на класс? Я не совсем понимаю, мы ведь оперируем понятием объекта, а класс - это всего лишь тип. Нам нужно создать...

Почему это не работает? Структура "Таймер" - C++ WinAPI
Есть некая структура: struct timers { int N; UINT_PTR *ID; void expansion(int _N); void create_timer(HWND hwnd, UINT_PTR...


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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,648
Записей в блоге: 26
24.04.2010, 16:36     "я" это EOF?! #13
Цитата Сообщение от AlexRyzhenko Посмотреть сообщение
Но MinGW DS и с int'ом не распознаёт эту букву...
С учётом того, что ты до сих пор так и не показал свои исходники, что-то конкретного сказать тут нечего
Yandex
Объявления
24.04.2010, 16:36     "я" это EOF?!
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru