Лекция 4. Более сложные элементы программирования (1153711), страница 3
Текст из файла (страница 3)
Если считан признак конца файла, то функция feof устанавливается в значение истина, иначе – в значение ложь.Открытие файла для записи предусматривает выполнение следующих действий:1. Поиск файла с заданным физическим именем; если файл ненайден, то создается новый файл.2. Содержимое файла очищается.133. Указатель файла устанавливается на конец файла, который, поскольку файл очищен, одновременно является его началом.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 (прочитать символиз потока) работают как с текстовыми, так и с двоичными файлами.Их шаблоны:int 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)14где buf - указатель на область памяти, с которой будет происходить обмен информацией, zap - длина записи, n - число считанных(записанных) записей, f - указатель на файл.После окончания работы с файлом его необходимо закрыть.
Призакрытии файла выполняется его сохранение (естественно, с перерегистрацией в каталоге). Кроме того, связь между программным и физическим именем файла, установленная при открытии файла, разрушается.Шаблон функции закрытия файла:int fclose(FILE * f) - возвращает значение нуль, если операциязакрытия прошла успешно.3.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"fscanf(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++)15{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 100void 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");16k=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, но каждая строка текстового файла считывается в переменную-структуру.#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");17if (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");}elseputs("k=0");}_getch();}18.