Лекция 3. Файлы в Си (1168206)
Текст из файла
Лекция 3. Файлы в Си3.1. Общие понятия.Термин файл используется в программировании в двух смыслах.В рамках операционной системы файл понимается как область памятивнешнего запоминающего устройства (обычно диска), имеющая имя. Валгоритмических языках файл - это тип данных, используемый, какправило, при работе с внешними запоминающими устройствами. В Синет специального типа файл, но есть предопределенный структурныйтип FILE, описание которого содержится в заголовочном файлеstdio.h.Файл - это последовательность однотипных компонент.Число компонент файла не ограничено. Компонентой файла можетбыть строка или байт, или значение какого-либо типа (целого, вещественного, структура, и т.
д.). После последней компоненты файластоит специальный код, называемый признаком конца файла; этот кодобычно ставится автоматически, без участия программиста.В классическом понимании файл рассматривается как абстрактное обобщение данных на устройстве с последовательным доступом, типичным представителем которого является магнитная лента.В библиотеках современных языков программирования, конечно, имеются средства и для работы с файлами прямого доступа.Абстрактная последовательность данных на некотором внешнемустройстве также называется потоком.Обычно в алгоритмических языках определяется программное ифизическое имя файлов. Программное имя - это имя переменнойтипа файл (в СИ типа FILE*), физическое имя - это имя файла навнешнем запоминающем устройстве.
Существуют специальные операторы, связывающие программное и физическое имя файла(см.§3.2).Файлы бывают текстовыми и двоичными.Текстовые файлы хранят информацию во внешнем представлении. Они имеют два основных признака: во-первых, их компонентами являются строки символов; во-вторых, эта символьная ин-формация при чтении из файла или записи в файл преобразуется всоответствии с типом вводимых или выводимых переменных. Этифайлы являются обобщением данных на устройстве консоль (CON).Умение работать с текстовыми файлами необходимо даже начинающим программистам, так как обычно имеется потребность в длительном хранении исходных и выходных данных.Текстовые файлы можно ввести в ЭВМ, прочитать, исправить спомощью текстового редактора. Они хранят информацию во внешнемпредставлении, в виде, понятном для человека.
Такие файлы частоназываются видимыми.Двоичный файл - это последовательность байтов; обмен информации между двоичным файлом и данными программы происходит без преобразования.3.2. Функции Си для работы с файламиШаблон структуры FILE и прототипы основных функций работы сфайлами хранятся в stdio.h.
Перед использованием файла необходимо:1. Описать его программное имя как указатель на структуру типаFILE:FILE *ИмяУказателя2. Открыть файл. Функция открытия файла устанавливает связьмежду программным и физическим именами файла и подготавливает его к использованию.Шаблон функции открытия файла:FILE *fopen(char *ИмяФайла, char *режим);первый параметр задает строку, в которой хранится физическоеимя файла, записанное по правилам операционной системы, второй режим открытия.Приведем некоторые режимы:“r” - открыть для чтения;“w” - открыть для записи;“rb” - открыть двоичный файл для чтения;“wb” - открыть двоичный файл для записи;“rt” - открыть текстовый файл для чтения;2“wt” - открыть текстовый файл для записи;“a” – открыть файл для дополнения.Результат функции fopen необходимо присвоить переменной типа FILE *.
Если функции fopen удалось открыть указанный файл, возвращается указатель на FILE. Если же файл не может быть открыт,возвращается NULL.Пример открытия файла и обнаружения ошибки при открытии:FILE *fp;fp=fopen(“x.txt”,”w”);if (fp==NULL)puts(“Ошибка при открытии файла”)else ....Или:FILE *fp;if ((fp=fopen(“x.txt”,”w”))==NULL){ puts(“Ошибка при открытии файла”);exit(1); }.Функция с шаблономint feof(FILE *fp);возвращает значение, не равное 0 (истина), если (при открытиифайла, или чтении из файла, или записи в файл) конец файла достигнут, и значение 0 (ложь) в противном случае.В стандартной библиотеке Си функции ввода-вывода, в частности доступа к файлам, могут возвращать значение, равное символьной константе (точнее макроопределению) EOF для индикации, чтодостигнут конец файла. Реальное значение EOF является отрицательным числом, зависящим от системы (в основном −1), что гарантирует несовпадение с кодом символа.Далее поясним, что такое открытие файла для чтения, записи идополнения.Открытие файла для чтения предусматривает выполнение следующих действий:1.
Поиск файла с заданным физическим именем; если файл ненайден, то выводится сообщение об ошибке.2. Указатель файла устанавливается на первую компоненту.33. Компонента, на которой стоит указатель, считывается в буфер.4. Если считан признак конца файла, то функция feof устанавливается в значение истина, иначе – в значение ложь.Открытие файла для записи предусматривает выполнение следующих действий:1.
Поиск файла с заданным физическим именем; если файл ненайден, то создается новый файл.2. Содержимое файла очищается.3. Указатель файла устанавливается на конец файла, который, поскольку файл очищен, одновременно является его началом.4. Функция feof устанавливается в значение истина. Это значениесохраняется при последующей записи в файл, т. е. запись происходит в конец файла.Открытие файла для дополненния предусматривает выполнениеследующих действий:1. Поиск файла с заданным физическим именем; если файл ненайден, то выдается сообщение об ошибке.2. Указатель файла устанавливается на конец файла (после последней компоненты).3. Функция feof устанавливается в значение истина.Рассмотренные ранее функции scanf, printf, puts, gets имеютаналоги для работы с текстовыми файлами. Их названия получаютсядобавлением справа буквы f к именам упомянутых функций.Шаблоны функций файлового форматного вывода и ввода:int fprintf(програм_имя_ файла, форматная_строка, список_вывода);int fscanf(програм_имя_ файла, форматная_строка, список_вывода);Шаблоны функций fputs и fgets:char *fgets(char *string, int nmax,FILE *f)char *fputs(char *string, FILE *f)где string - адрес начала вводимого массива символов,f - указатель на текстовый файл,nmax - максимальная длина вводимой строки плюс 1.Функции putc (записать символ в поток) и getc (прочитать символиз потока) работают как с текстовыми, так и с двоичными файлами.Их шаблоны:4int putc(int ch, FILE* f)(если оператор выполнен успешно, товозвращается записанный символ, иначе EOF)int getc(FILE *f)(если считывание не выполнено, то EOF)Для работы с двоичными файлами предназначены функциичтения и записи блоков:unsigned fread(void *buf, int zap, int n,FILE *f)unsigned fwrite(const void *buf, int zap, int n,FILE *f)где buf - указатель на область памяти, с которой будет происходить обмен информацией, zap – размер в байтах считываемого илизаписываемого элемента (записи), n – максимальное число считываемых (записываемых) элементов, f - указатель на файл.Функция fread (fwrite) возвращает количество прочитанных (записанных) записей, которое стандартно равно n, но может быть меньше n при возникновении ошибки или достижении конца файла до считывания n записей.После окончания работы с файлом его необходимо закрыть.
Призакрытии файла выполняется его сохранение (естественно, с перерегистрацией в каталоге). Кроме того, связь между программным и физическим именем файла, установленная при открытии файла, разрушается.Шаблон функции закрытия файла:int fclose(FILE * f) - возвращает значение нуль, если операциязакрытия прошла успешно.3.3. Примеры программ, использующих файлыПример 1. Размеры матрицы n и m и значения элементов матрицы считываются из текстового файла f_in.txt , затем матрица изменяется (скажите, как) и выводится в текстовый файл f_out.txt.#include <stdio.h>#include <conio.h>void main(){float a[5][5]; int n,m,i,j;FILE* f_in, *f_out;f_in=fopen("f_in.txt","rt"); //"c:\\dir\\f_in.txt"5fscanf(f_in,"%d%d", &n,&m);for (i=0;i<n;i++)for (j=0;j<m;j++)fscanf(f_in,"%f",&a[i][j]);//fscanf(f_in,"%f", *(a+i)+j);//закончен ввод из файлаfor (i=0;i<n;i++)for (j=0;j<m;j++)a[i][j]=a[i][j]*a[i][j];//закончена обработка матрицыf_out=fopen("f_out.txt","wt");fputs("output matrix:\n",f_out);for (i=0;i<n;i++){for (j=0;j<m;j++)fprintf(f_out,"%6.1f ",a[i][j]);fprintf(f_out,"\n");}// вывели изменную матрицу в файлfclose(f_in);//необязательноfclose(f_out);//обязательно!!!!!puts("output file is ready!"); puts("output file is ready!");//каждая фраза на отдельной строке_getch();}Пример 2.
В каждой строке входного файла f_in.txt через пробел записаны фамилия и имя человека. Каждая строка входного файла считывается в переменную-строку s. В выходной файл f_out.txt записываются строки входного файла, содержащие фамилии «Иванов» и «Иванова». Обратите наличие пробела после фамилий в соответствующихстроковых литералах программы. Зачем он нужен?#include <stdio.h>#include <conio.h>#include <string.h>#define NMAX 1006void main(){char s[NMAX]; int k,i;//k-число ИвановыхFILE *f_in, *f_out;f_in=fopen("f_in.txt", "rt");if (f_in==NULL)puts("file is not opened");elseif feof(f_in)puts("file is empty");else{f_out=fopen("f_out.txt", "wt");k=0;while (fgets(s,NMAX+1,f_in)!=NULL){if (strstr(s,"Иванов ")!=NULL || strstr(s,"Иванова ")!=NULL){k=k+1;fputs(s,f_out);}}if (k>0){fclose(f_out);printf ("k=%d\n", k);puts("output file is ready");}elseputs("k=0");}_getch();}Пример 3.
Та же задача, что и в примере 2, но каждая строка текстового файла считывается в переменную-структуру.7#include <stdio.h>#include <conio.h>#include <string.h>#pragma hdrstop#define NMAX 100void main(){ typedef struct {char s1[NMAX],s2[NMAX];} fam_im;fam_im f_i;int k,i;//число ИвановыхFILE *f_in, *f_out;f_in=fopen("f_in.txt", "rt");if (f_in==NULL)puts("file is not opened");elseif feof(f_in)puts("file is empty");else{f_out=fopen("f_out.txt", "wt");k=0;while (fscanf(f_in,"%s %s",&f_i.s1,&f_i.s2)!=EOF){if (strcmp(f_i.s1,"Иванов")==0|| strcmp(f_i.s1,"Иванова")==0){k=k+1;fprintf(f_out, "%s %s\n", f_i.s1,f_i.s2);}}if (k>0){fclose(f_out);printf ("k=%d\n", k);puts("output file is ready");8}elseputs("k=0");}_getch();}9.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.