Лекция 5-1 2017 Файлы, случайные числа, списки (Лекции (2017))
Описание файла
Файл "Лекция 5-1 2017 Файлы, случайные числа, списки" внутри архива находится в следующих папках: Лекции 2017, Лекции 2017. PDF-файл из архива "Лекции (2017)", который расположен в категории "". Всё это находится в предмете "программирование" из 2 семестр, которые можно найти в файловом архиве НГУ. Не смотря на прямую связь этого архива с НГУ, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Лекция №5ФайлыРабота с файлами в языке ССлучайные числаГенераторы случайных чиселИспользование в языке ССписки данныхУказатели на структурыСписки данныхКурс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.ФайлыФайл (англ. file) — именованная область данных на носителе информацииСлово file впервые применено к компьютерному хранилищу в 1950 году«…результаты бесчисленных вычислений можно держать «в картотеке» (on file) иполучать снова. Эта «картотека» теперь существует в запоминающей трубке,разработанной в лабораториях RCA. Она электрически сохраняет цифры, отправленные ввычислительную машину, и держит их в хранилище, заодно запоминая новые — ускоряяинтеллектуальные решения в лабиринтах математики.
»В 1952 году слово file отнесли к колоде перфокарт.[2] Поначалу словом file называлисамо устройство памяти, а не его содержимое. Например, диски IBM 350, называлисьdisk files.Системы наподобие Compatible Time-Sharing System ввели концепцию файловойсистемы, когда на одном запоминающем устройстве существует несколько виртуальных«устройств памяти», что и дало слову «файл» современное значение.Имена файлов в CTTS состояли из двух частей, «основного имени» и «дополнительногоимени» (последнее существует и поныне как расширение имени файла).Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Файлы.
Расширение.Файл (англ. file) — именованная область данных на носителе информацииРасширение имени файла (часто расширение файла или расширение) каксамостоятельный атрибут файла существует в файловых системах FAT16, FAT32, NTFS,используемых операционными системами MS-DOS, DR-DOS, PC DOS, MS Windows ииспользуется для определения типа файла. Оно позволяет системе определить, какимприложением следует открывать данный файл.(По умолчанию в операционной системе Windows расширение скрыто от пользователя.)В остальных файловых системах расширение — условность, часть имени, отделённаясамой правой точкой в имени.*.doc*.docx*.ppt*.pptx*.slnКурс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Файлы в ОС UnixИнтуитивное определение файла звучит примерно так. Файл -- именованная область нажестком диске. C точки зрения ОС UNIX это совсем не так.В ОС UNIX файл - очень удобная абстракция. С точки зрения UNIX файлом называется"что-нибудь", из чего можно считывать информацию или во что можно записыватьинформацию:• Файлы в обычном смысле: файлы, которые хранятся на жестком диске (можносчитывать из них и запиcывать в них информацию);• Экран монитора: файл, в который можно выводить информацию (отобразится наэкране монитора);• Клавиатура: файл, из которого можно считывать информацию;• Принтер: файл, в который можно выводить информацию (печать текста);• Модем: файл, из которого можно считывать информацию и в который можнозаписывать информацию (обмен информации по сети);Файл - это всё, что предназначено для ввода или вывода информации.С этой точки зрения файлы бывают разными: принтер может только выводитьинформацию, а клавиатура -- только вводить.
У такого рода файлов есть многоособенностей. У файла на жестком диске есть понятие конца файла. Мы можем егосчитывать до тех пор, пока он не кончится. Тогда как у клавиатуры нет конца.Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Работа с файлами в Си.Самый распространенный способ работы с файлами в Си связан со структурой FILE.Эта структура определена в заголовочном файле стандартной библиотеки <stdio.h>.Размер этой структуры и ее поля зависят от ОС и от версии компилятора. Поэтому никтоне пользуется структурой FILE.
Обычно пользуются указателем на эту структуру: FILE*.Например:FILE *f = fopen("file1.txt", "r");fopen - функция из стандартной библиотеки. Первый параметр - имя файла (в текущемкаталоге). Второй параметр задает режим открытия файла; в данном случае "r" означает,что файл будет открыт только для чтения.Эта функция возвращает ненулевой указатель, если открытие прошло успешно; ивозвращает NULL, если произошла ошибка.
Ошибка может возникать в следующихситуациях:• не существует файла;if (f == NULL) {• у программы недостаточно прав// файл не удалось открытьдоступа для работы с файлом.}else {// Работа с файлом}Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Работа с файлами в Си.Что надо сделать после того, как мы поработали с файлом?Формальный ответ: "Закрыть файл. - fclose(f);Ввиду механического устройства жесткого диска, данные в файл попадают не сразу.Сначала данные записываются в так называемый буфер (область оперативной памяти), икогда он переполнится, то данные из буфера будут записаны в файл. Такая схемапридумана для ускорения работы с файлами.Буфер - это поле структуры FILE: указатель на массив char'ов.Если мы напишем fprintf(...), то запись произведется в буфер.
И только тогда, когда буфербудет заполнен, он будет сразу весь записан на жесткий диск.По этой причине, если мы не закроем файл функцией fclose(f), то последние данные избуфера не запишутся в файл. Отсутствие этой команды может привести к потере данныхв файле, который был открыт для записи (дозаписи).Зачем закрывать файлы, открытые только на чтение?Если не закрывать файлы (которые открыты даже для чтения), то это может привести кограничению доступа к файлу для других программ.Ограничения зависят от ОСв Windows если файл открыт на чтение, то из другой программы его нельзя удалитьВ любой ОС есть ограничение на количество одновременно открытых файлов. И это ещеодна причина для закрытия файлов.Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Работа с файлами в Си.С точки зрения UNIX клавиатура и экран - это файлы.Стандартные константы (заранее открытые файлы):• FILE *stdin- стандартный файл (поток) ввода• FILE *stdout- стандартный файл (поток) вывода• FILE *stderrscanf(...) ~ fscanf(stdin, ...)printf(...) ~ fprintf(stdout, ...)Метод отладки программы: подмена потоков://FILE *f = fopen(...);FILE *f = stdin;При этом код программы будет содержать такие функции: fscanf(f, ...) или fprintf(f, ...).stderr - это стандартный файл (поток) ошибок. По умолчанию выводит данные на экран.- небуферизованный файл (поток). Поэтому в этот файл (поток) все байты уходятбез "задержки", которая могла бы возникнуть при буферизированном подходе.fprintf(stderr, ...);Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Текстовые и бинарные файлы.fopen(f, "file1.txt", "w");fopen("file1.txt", "wt") -- откроет файл как текстовый файл;fopen("file1.txt", "wb") -- откроет файл как бинарный файл.Символы переноса строк запишутся по разному••••"wb" в Windows"wt" в Windows"wt" в UNIX"wb" в UNIX- 6 байт- 7 байт- 6 байт- 6 байтfprintf("Hello\n");- Hello\10- Hello\10\13- Hello\10- Hello\10При чтении файла:• Параметр «rb" - символ \10 будет восприниматься как перевод строки• Параметр «rt" - символ \10\13 будет восприниматься как перевод строкиКурс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Пример работы с файламиvoid main(){int a;FILE* f_src = fopen("src.txt", "rt");FILE* f_dst = fopen("dst.txt", "wt");if (f_src == NULL || f_dst == NULL){printf ("Error!");return;}while (!feof(f_src)){fscanf(f_src, "%d", &a);a = a*a;fprintf(f_dst, "%d\n", a);}printf("Finish!\n");fclose(f_src);fclose(f_dst);}Курс «Основы программирования».
НГУ, ФФ, 2017Лысаков К.Ф.Пример работы с файламиvoid main(){int a;FILE* f_src = fopen("src.txt", "rt");FILE* f_dst = fopen("dst.txt", "wt");if (f_src == NULL || f_dst == NULL){printf ("Error!");return;}while (!feof(f_src)){fscanf(f_src, "%d", &a);a = a*a;fprintf(f_dst, "%d\n", a);}printf("Finish!\n");fclose(f_src);fclose(f_dst);• Некорректная работапри символьных данных• Отсутствие провероккорректности• Лишний «переводстроки» ведет кнекорректной работе}Курс «Основы программирования». НГУ, ФФ, 2017Лысаков К.Ф.Работа с файлами через строкиВ языке C есть семейство функций ~ atoi (a - ASCII, i - integer)N = atoi(string);Надо заметить, что функция atoi безопасная, но не очень удобная:• Безопасная в том смысле, что не сломается: atoi("25a") == 25• "Неудобства" заключаются в том, то если мы передаем в качестве параметрастроку, в которой есть не только числа, нужно быть очень внимательным изнать, как работает эта функция.
Функция atoi никак не проинформирует нас,если преобразование прошло неудачно.void main()• atoi("abc") == 0{int N = atoi(string);long L = atol(string);long long LL = atoll(string);float F = atof(string);Курс «Основы программирования». НГУ, ФФ, 2017char temp[20];int a;scanf("%s", temp);a = atoi(temp);printf("%d", a);}Лысаков К.Ф.Работа с файлами через строкиvoid main(){int a;char str[20];FILE* f_src = fopen("src.txt", "rt");FILE* f_dst = fopen("dst.txt", "wt");if (f_src == NULL || f_dst == NULL){printf ("Error!");return;}while (!feof(f_src)){fscanf(f_src, "%s", str);a = atoi(str);a = a*a;fprintf(f_dst, "%d\n", a);}printf("Finish!\n");fclose(f_src);fclose(f_dst);}Курс «Основы программирования».