Примеры решения задач по файлам
Пример 1
Дан текстовый файл, содержащий целые числа (<= 10000 элементов). Переписать файл, упорядочив целые числа по возрастанию или убыванию (выбирает пользователь). Имя файла передается в параметрах командной строки.
int main(int argc, char *argv[])
{
int ARR[10000], n=0, v;
FILE *f = NULL;
if(argc<2) {printf("Не указано имя файла!\n"); return 1;}
f = fopen(argv[1],"r");
if(!f) {printf("Файл не найден!\n"); return 1;}
while(fscanf(f,"%d",&v) == 1) ARR[n++] = v;
fclose(f);
printf("Sort (INC-0, DEC-!0):"); scanf("%d",&v);
if(v) qsort(ARR,n,sizeof(int),Cmp1);
else qsort(ARR,n,sizeof(int),Cmp2);
f = fopen(argv[1],"w");
if(!f) {printf("Невозможно создать файл!\n"); return 1;}
for(int i=0;i<n;i++) fprintf(f,"%d\n",ARR[i]);
fclose(f);
return 0;
}
int Cmp1(const void *p1,const void *p2)
{
return *((int *)p2) - *((int *)p1);
}
int Cmp2(const void *p1,const void *p2)
{
return *((int *)p1) - *((int *)p2);
}
Пример 2
Дан текстовый файл, содержащий в строках целые числа (максимальная длина строки – 100 символов). Вычислить сумму чисел в каждой строке и записать в новый файл. Имена файлов передаются в параметрах командной строки.
int main(int argc, char *argv[])
{
FILE *f = NULL, *r = NULL;
if(argc<3) {printf("Не указано имя файла!\n"); return 1;}
f = fopen(argv[1],"r");
if(!f) {printf("Файл не найден!\n"); return 1;}
r = fopen(argv[2],"w");
if(!r) {
printf("Can\'t create file!\n");
fclose(f); return 1;
}
while(!feof(f)){
char str[100] = "”;
fgets(str,100,f);
if(str[0]==0) continue;
char *ptr = strtok(str," \t");
if(!ptr) continue;
int sum = atoi(ptr);
while((ptr = strtok(NULL," \t")) != NULL)
sum += atoi(ptr);
fprintf(r,"%d\n",sum);
}
fclose(f); fclose(r);
return 0;
}
Пример 3
Дан бинарный файл, содержащий вещественные числа. Найти максимум и минимум, поменять их в файле местами. Имя файла указывается в параметрах командной строки.
int main(int argc, char *argv[])
{
FILE *f = NULL;
if(argc < 2) {printf("Не указано имя файла!\n"); return 1;}
f = fopen(argv[1],"rb+");
if(!f) {printf("Файл не найден!\n"); return 1;}
double max, min, val;
int imax = 0, imin = 0, i = 1;
fread(&val,sizeof(double),1,f);
max = min = val;
while(!feof(f)){
fread(&val,sizeof(double),1,f);
if(val > max) {max = val; imax = i;}
if(val < min) {min = val; imin = i;}
i++;
}
fseek(f,imax*sizeof(double),0);
fwrite(&min,sizeof(double),1,f);
fseek(f,imin*sizeof(double),0);
fwrite(&max,sizeof(double),1,f);
fclose(f); return 0;
}
Пример 4
Дан бинарный файл, содержащий записи со следующими полями:
ФИО студента (строка 30 символов),
Курс (целое число)
Средний балл (вещественное число).
Переписать файл, упорядочив записи по курсу, а внутри курса – по фамилии. Имя файла передается в параметрах командной строки.
typedef struct {
char fio[30]; int kurs; double ball;
} STUDENT;
int Cmp(const void *p1, const void *p2)
{
STUDENT *s1 = (STUDENT *)p1, *s2 = (STUDENT *)p2;
if(s1->kurs != s2->kurs) return s1->kurs - s2->kurs;
return strcmp(s1->fio,s2->fio);
}
int main(int argc, char *argv[])
{
if(argc < 2) {printf("Не указано имя файла!\n"); return 1;}
FILE *f = fopen(argv[1],"rb+");
if(!f) {printf("Файл не найден!\n"); return 1;}
long int num = 0;
fseek(f,0,2); num = ftell(f); rewind(f);
if(num%sizeof(STUDENT)) {
printf("Invalid file!\n"); fclose(f); return 1;
}
num/=sizeof(STUDENT);
STUDENT Arr[num];
fread(Arr,sizeof(STUDENT),num,f);
rewind(f);
qsort(Arr,num,sizeof(STUDENT),Cmp);
fwrite(Arr,num,sizeof(STUDENT),f);
fclose(f);
return 0;
}