Воскресенье, 01.12.2024, 11:10
Приветствую Вас, Гость |
Меню сайта
Наш опрос
Нужен ли форум на этом сайте?
Всего ответов: 1313
Статистика

Онлайн всего: 5
Гостей: 5
Пользователей: 0

Примеры решения задач по файлам

Пример 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;

}

Форма входа
Поиск
Мы в сети
Реклама
Для того чтобы не видеть рекламу в правом верхнем углу сайта пройдите простую процедуру регистрации
ФОРУМ
У нас наконецто появился форум! Добро пожаловать! Будьте первыми, задайте направление форуму! =)
--- Не стесняемся - заходим на форум! ---