📓16. Текстовые файлы. Функции для работы с текстовыми файлами. Алгоритмы работы с текстовыми файл
Текстовые файлы
Текстовые файлы - файлы, содержащие текстовые данные, организованные в виде строк. При работе с текстовым файлом нужно помнить, что это файлы последовательного доступа, для каждого действия нужно открывать файл заново на нужный режим.
Алгоритм работы:
Открыть файл
Сделать проверку, открылся ли файл
Записать/считать данные из файла
Закрыть файл
Сортировка/удаление
Открыть файл на чтение
Проверить на открытие
Считать значения из файла в массив
Отсортировать массив/удалить элемент из массива
Открыть файл на запись (он очистится)
Записать измененный массив в файл
Функции для работы с текстовыми файлами.
Открытие файлового потока. Возвращает указатель на поток
FILE* fopen (const char* имя, const char* режим открытия);
Закрытие файлового потока
void fclose (FILE* ptrFile);
Запись в файл. Возвращает общее количество записанных символов
int fprintf (FILE* ptrFile, const char* format, ...);
Чтение из файла. Возвращает количество аргументов, которым действительно были присвоены значения. Если при чтении была сделана попытка выйти за конец файла, то возвращается EOF.
int fscanf(FILE* ptrFile, const char* format, …);
Записывает строку в файл (не добавляет \n). В случае успеха возвращается неотрицательное значение, иначе - EOF.
int fputs(const char * string, FILE * ptrFile);
Считывает указанное количество символов в строку. В конце добавляет \n\0. В случае успеха возвращает указатель на строку. При ошибке возвращает NULL
char * fgets(char * string, int num, FILE * ptrFile);
Возвращает символ из файла. При ошибке возвращает EOF
int fgetc(FILE * ptrFile);
#include<stdio.h>#include<stdlib.h>#include<string.h>#defineFILE_EXIST1#defineFILE_NOT_EXIST0typedefstructStudent_t {char surname[20];int group;int grades[3];} student;student *readStudent(int*c);voidinput();voidworkStudents(student *arrayOfStudent,int c);voidworkSort(student *arrayOfStudent,int c);voidoutputStudents();voidswap(student *a, student *b);intcheckFile(constchar*filename);int*reallocGroup(int*group,int*size);intmain(){char*file = ("aaa.txt");if (checkFile(file)== FILE_NOT_EXIST) {input(); }else{printf("File exist\n"); }int c =0; student *arrayOfStudent =readStudent(&c);if (arrayOfStudent !=NULL){workStudents(arrayOfStudent, c);outputStudents(); }return0;}intcheckFile(constchar*filename){int result = FILE_EXIST; FILE *file =fopen(filename,"r");if (file ==NULL){ result = FILE_NOT_EXIST; }else{fclose(file); }return result;}voidoutputStudents(){ FILE *file =fopen("aaa.txt","r");if(file !=NULL){ student temp; while(fscanf(file, "%20s %d %d %d %d", temp.surname, &temp.group, &temp.grades[0], &temp.grades[1], &temp.grades[2]) != EOF){
printf("%s%d%d%d%d\n",temp.surname,temp.group,temp.grades[0],temp.grades[1],temp.grades[2]); }fclose(file); }}int*reallocGroup(int*group,int*size){*size =*size +1; group = (int*)realloc(group,sizeof(int) * (*size));return group;}voidworkStudents(student *arrayOfStudent,int c){int size =1;int*group =malloc(sizeof(int) * size);*group = (arrayOfStudent)->group;for(int i =0; i < c; i++){int tempGroup = (arrayOfStudent+i)->group;int res =-1;for(int k =0; k < size; k++){if(tempGroup !=*(group+k)) { res =1; } }if(res ==1){ group =reallocGroup(group,&size);if(group ==NULL) {break; }*(group + i) = (arrayOfStudent+i)->group; } }double avgGrades[size];for(int i =0; i < size; i++){int l =0;for(int k =0; k < c; k++){double avg =0;if((arrayOfStudent+k)->group ==*(group+i)){ l++; avg = ((arrayOfStudent+k)->grades[0] + (arrayOfStudent+k)->grades[1] + (arrayOfStudent+k)->grades[2]) / 3;
} avgGrades[i] += avg; } avgGrades[i] = avgGrades[i]/l; }double min = avgGrades[0];int g =*group;for(int i =0; i < size; i++){if(min > avgGrades[i]){ min = avgGrades[i]; g =*(group+i); } } FILE *file =fopen("aaa.txt","w");if (file !=NULL) {for (int i =0; i < c; i++) {if ((*(arrayOfStudent + i)).group != g) { student tmp =*(arrayOfStudent + i);fprintf(file,"%s\n%d\n%d\n%d\n%d\n",tmp.surname,tmp.group,tmp.grades[0],tmp.grades[1],tmp.grades[2]); } }fclose(file); }}voidinput(){ FILE *file =fopen("aaa.txt","w");if(file !=NULL){int n;printf("insert quantity students");scanf("%d",&n);for(int i =0; i < n; i++){ student tmp;printf("Input surname:");scanf("%20s",tmp.surname);printf("Input group:");scanf("%d",&tmp.group);printf("Input grades:");scanf("%d%d%d",tmp.grades,tmp.grades +1,tmp.grades +2);fprintf(file,"%s\n%d\n%d\n%d\n%d\n",tmp.surname,tmp.group,tmp.grades[0],tmp.grades[1],tmp.grades[2]); }fclose(file); }}student *readStudent(int*c){int key; FILE *file =fopen("aaa.txt","r"); student *result =NULL;if(file !=NULL){ student tmp; while(fscanf(file, "%20s %d %d %d %d", tmp.surname, &tmp.group, &tmp.grades[0], &tmp.grades[1], &tmp.grades[2]) != EOF){
*c = (*(c))+1; }rewind(file); student *arrayOfStudent = (student *)malloc(sizeof(student) **c);for(int i =0; i <*c; i++){ student temp; key = fscanf(file, "%20s %d %d %d %d", temp.surname, &temp.group, &temp.grades[0], &temp.grades[1], &temp.grades[2]);
*(arrayOfStudent + i) = temp;if (key !=5){printf("\ndata crashed"); arrayOfStudent =NULL;break; } } result = arrayOfStudent;fclose(file);if (arrayOfStudent ==NULL){free(arrayOfStudent); } }return result;}voidworkSort(student *arrayOfStudent,int c) {for (int j =0; j < c; j++) {for (int i =0; i < c -1; i++) {if ((*(arrayOfStudent + i)).group < (*(arrayOfStudent + i +1)).group)swap(arrayOfStudent + i, arrayOfStudent + i +1); else if (strcmp(arrayOfStudent[i].surname, arrayOfStudent[i + 1].surname) > 0 && ((*(arrayOfStudent + i)).group == (*(arrayOfStudent + i + 1)).group))
swap(arrayOfStudent + i, arrayOfStudent + i +1); } } FILE *file =fopen("aaa.txt","w");if (file !=NULL) {for (int i =0; i < c; i++) { student tmp =*(arrayOfStudent + i);fprintf(file,"%s\n%d\n%d\n%d\n%d\n",tmp.surname,tmp.group,tmp.grades[0],tmp.grades[1],tmp.grades[2]); }fclose(file); }}voidswap(student *a, student *b) { student tmp =*a;*a =*b;*b = tmp;}