- TombRaider.Ru - Форумы
- → Просмотр профиля: Репутация: Smile
Мое участие в сообществе
- Группа: Members2
- Сообщений: 218
- Просмотров: 9292
- Титул: Исследователь
- Возраст: 29 лет
- День рождения: Июль 3, 1995
-
Пол
Мужской
-
Имя
Евгений
Последние посетители
#301778 Майя
Автор: Smile на 20 April 2014 - 09:34
#301413 Смешные Видео Ролики!!!
Автор: Smile на 31 July 2013 - 11:45
#301334 Майя
Автор: Smile на 02 July 2013 - 22:45
Привет! Очень извиняюсь, что не перезалил демо в "скором будущем". Вот, старенькое демо. Оказывается, всё - таки уровень сильно изменился по сравнению с этой версией! В августе предыдущего года я сделал ещё несколько анимашек, но не хотел никуда отправлять. А теперь внезапно захотел. Смотрим.
#299996 Программирование
Автор: Smile на 29 December 2012 - 20:58
Всем привет =)
Значит так, я царапаю программульки на Visual C++ Express Editon 2008 при помощи замечательного учебника (вернее, учебников два: том 1 и том 2). Это для начала.
Идём дальше. Дошёл до темы "Стандартный файловый ввод - вывод". Речь идёт про операции последовательного чтения из файла. Вот текст программы:
#include <stdio.h> #include <conio.h> int main (void) { FILE* pf = NULL; int pos; unsigned char dat; pf = fopen ("C\\TEMP\\MyText.txt","rb"); if ( pf != NULL ) { while ((dat = fgetc(pf))!= EOF) { pos = ftell (pf); printf ("Byte on %d position in file = %c\n", pos, dat); } fclose (pf); } else printf ("Failed to open file MyText.txt"); //Screen delay: printf ("Enter any key to exit"); getch(); return 0; }
В содержимое файла "MyText.txt" накатал следующее: "qwerty".
Всё понятно, всё ясно. Ещё: потом немножко дополнил текст под свой лад, но суть не изменилась:
#include <stdio.h> #include <conio.h> #include <windows.h> int main (void) { SetConsoleCP(1251); SetConsoleOutputCP(1251); FILE* pf = NULL; int pos; unsigned char dat; pf = fopen ("C:\\Users\\Евгений\\Documents\\Visual Studio 2008\\Projects\\Работа с файлами\\Работа с файлами\\MyText.txt","rb"); if ( pf != NULL ) { while ((dat = fgetc(pf))!= EOF) { pos = ftell (pf); printf ("Байт на %d позиции в файле = %c\n", pos, dat); getch(); } fclose (pf); } else printf ("Неудачная попытка открытия файла: %s\n",strerror(errno)); printf ("Нажмите любую клавишу, чтобы выйти: \n"); getch(); return 0; }
Далее. Запускаю проект, Всё работает. Молодец, но не правильно. По идее, программа должна была вывести каждый символ из qwerty с новой строки. Да, программулька с этим справилась. Но вместо того, чтобы вывести "Нажмите любую клавишу, чтобы выйти: ", она выводит бесконечно вот это:
Покер фейс.
Ладно, в головёшке моей бестолковой вертятся следующие мысли:
EOF - это есть конец файла, типа енд оф файл, ну или проще говоря, константа "-1". Окей, а функция fgetc() возвращает значение символа и автоматом переводит указатель текущей позиции на следующий, а когда достигнет конца файла, то вернёт "-1". Хорошо, но у нас же dat = fgetc(pf). То есть, по идее, когда мы доползём до конца файла, то значение переменной dat должно быть -1, но в объявлении этой переменной ясно сказано, что это есть unsigned char, то есть, эта переменная принимает значение от 0 до 255. Ага, тогда: когда переменной dat посылается значение "-1", то эта переменная принимает значение 255 (логично, кстати, о такой интересной штучке про переменную типа char подробнее было описано главой назад). А эта переменная из таблицы ASCII есть буковка "я". Тогда вот программа и выводит эту зловещую букву бесконечно раз. Ладно - ладно. Тогда я совсем чуть - чуть поменял код: вместо строки while ((dat = fgetc(pf))!= EOF) я написал while ((dat = fgetc(pf))!= 255). Вроде бы всё нормально, программа теперь полноценно идёт, но блин. А если в файле будет бувка "я", то программа тупо закончит выполнять цикл, ибо "я" есть 255... Нет, так не идёт. На свой страх и риск я вместо "unsigned char dat;" написал "int dat;", ибо теперь -1 это и есть -1 (тупо объяснил =D). В общем это я сделал из - за вот этого (выделено красным): printf ("Байт на %d позиции в файле = %c\n", pos, dat);. То есть, в итоге вы всё равно выведем буковку))) А вот собственно и вопрос: а так естественно/ я хоть правильно сделал? И почему автор написал программу именно так (в смысле, как в самом начале, не предусмотрев зацикливания)? В итоге у меня такой код:
#include <stdio.h> #include <conio.h> #include <windows.h> int main (void) { SetConsoleCP(1251); SetConsoleOutputCP(1251); FILE* pf = NULL; int pos; int dat; pf = fopen ("C:\\Users\\Евгений\\Documents\\Visual Studio 2008\\Projects\\Работа с файлами\\Работа с файлами\\MyText.txt","rb"); if ( pf != NULL ) { while ((dat = fgetc(pf))!= EOF) { pos = ftell (pf); printf ("Байт на %d позиции в файле = %c\n", pos, dat); //getch(); } fclose (pf); } else printf ("Неудачная попытка открытия файла: %s\n",strerror(errno)); printf ("Нажмите любую клавишу, чтобы выйти: \n"); getch(); return 0; }
#299018 Авторские куклы
Автор: Smile на 02 October 2012 - 21:19
#298979 C днем Рождения,Мэрилин!
Автор: Smile на 30 September 2012 - 07:12
#298740 С Днем Рожденья, Натали
Автор: Smile на 31 August 2012 - 00:56
#298702 Авторские куклы
Автор: Smile на 23 August 2012 - 20:18
Очень понравились очечи Лары=) А костюмы шикарны! Цвет кожи у кукол как настоящий (это пластик?) )))
#298685 Рисунки от руки.
Автор: Smile на 22 August 2012 - 18:20
Читаю твой фанфик. Ваще шикарно
А у меня везде открываются картинки
#298665 С днем рождения, Andariel!
Автор: Smile на 22 August 2012 - 10:33
#298656 ВАШИ работы в Photoshop-e
Автор: Smile на 20 August 2012 - 13:08
#298582 Рукоделие
Автор: Smile на 08 August 2012 - 10:15
Пинетки
Баловался с разными пряжами
Тогда же и шил:
Белка
Негритянка
Кикимора
Тыква
Тролль
Динозавр (или дракон?)
Пойду искать оригами. Где - то завалялись в пакете.
#298508 Поместье Крофт... Что дальше?
Автор: Smile на 24 July 2012 - 07:43
- TombRaider.Ru - Форумы
- → Просмотр профиля: Репутация: Smile
- Privacy Policy
- Правила форума ·