Текстовые файлы - файлы, содержащие текстовые данные, организованные в виде строк. При работе с текстовым файлом нужно помнить, что это файлы последовательного доступа, для каждого действия нужно открывать файл заново на нужный режим.
Алгоритм работы:
Открыть файл
Сделать проверку, открылся ли файл
Записать/считать данные из файла
Закрыть файл
Сортировка/удаление
Открыть файл на чтение
Проверить на открытие
Считать значения из файла в массив
Отсортировать массив/удалить элемент из массива
Открыть файл на запись (он очистится)
Записать измененный массив в файл
Функции для работы с текстовыми файлами.
Открытие файлового потока. Возвращает указатель на поток
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>
#define FILE_EXIST 1
#define FILE_NOT_EXIST 0
typedef struct Student_t {
char surname[20];
int group;
int grades[3];
} student;
student *readStudent(int *c);
void input();
void workStudents(student *arrayOfStudent, int c);
void workSort(student *arrayOfStudent, int c);
void outputStudents();
void swap(student *a, student *b);
int checkFile(const char *filename);
int *reallocGroup(int *group, int *size);
int main(){
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();
}
return 0;
}
int checkFile(const char *filename){
int result = FILE_EXIST;
FILE *file = fopen(filename,"r");
if (file == NULL){
result = FILE_NOT_EXIST;
}
else{
fclose(file);
}
return result;
}
void outputStudents(){
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;
}
void workStudents(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);
}
}
void input(){
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;
}
void workSort(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);
}
}
void swap(student *a, student *b) {
student tmp = *a;
*a = *b;
*b = tmp;
}