П р и л о ж е н и е  1

Примеры обработки текстовых и бинарных файлов

Пример 1. Дан текстовый файл, фразы в котором отделены друг от друга точками, а слова – пробелами и знаками препинания. Каждая фраза располагается не более, чем на одной строке. Удалить из этого файла все фразы, содержащие цифры.

#include 
#include 

int main (void)
{
   char str[100], c;
   int i, n;
   FILE *fin, *fout;
   fin = fopen("text.txt", "rt"); /* исходный файл */
   fout = fopen("rezt.txt", "wt"); /*новый файл для
 сохранения результата */
   if(!fin) /* если не открылся исходный файл */
   {  /* сообщаем об ошибке */
      printf("Can not open text file\n"); 
      system (“pause”);
      return 0; /* прерываем программу */
   }
   if (!fout) /*если не удалось создать новый файл */
   {    /* сообщаем об ошибке */
      printf("Can not create text file\n"); 
      system (“pause”);
      return 0; /* прерываем программу */
   }
   printf("\n\nIn file: \n");
   while(!feof(fin)) /* пока не конец исходного файла */
   {
      i = 0;
      n = 0;
      do
      {
         fscanf(fin, "%c", &c); /* читаем один символ */
         if(c!='\n'&&!(c==' ' && i==0)) 
         { /* если это не символ конца строки 
и не начальный пробел */
            str[i] = c; /* присоединяем его к фразе */
            i++;
         }
         if (c>='0'&&c<='9') /* если это цифра */
            n++; /* устанавливаем флаг */
      } while(c!='.'&&!feof(fin)); /* пока не конец
фразы и не конец файла*/
      str[i] = '\0'; /* завершаем фразу */
      if(!n) /* если флаг не установлен (цифр не было) */
      fprintf(fout, "%s\n", str); /* запись фразы 
в новый файл */
   }
   fclose(fin); /* закрываем файлы */
   fclose(fout);
   return 0;
}

Пример 2. В текстовом файле записаны целые числа. Подсчитать, сколько чисел содержится в каждой строке.

#include 
main()
{
   FILE *f;
   int x,k=0;
   char c;
   f=fopen("int.txt","r");
   if (!f) /* если не открылся исходный файл */
   {  /* сообщаем об ошибке */
      printf("Can not open text file\n"); 
      system ("pause");
      return 0; /* прерываем программу */
   }
   while (!feof(f)) /* пока не конец файла */
   {
      fscanf(f,"%d",&x); /* читаем число */
      k++;    /* увеличиваем счетчик */
      c=fgetc(f); /* читаем символ – разделитель чисел */
      if (c=='\n'||c==EOF) /* если достигнут конец строки 
                            или конец файла */
      {
         printf("%d  ",k); /* выводим значение счетчика 
                             на экран */
         k=0;  /* обнуляем счетчик для следующей строки */
      }
   }
   fclose(f);
   return 0;
}

Пример 3. Компоненты бинарного файла – целые числа. Записать в этот файл вместо отрицательных чисел их квадрат.

#include 
#include 
#include 
void Gen_press(void); /* функция создания бинарного файла, 
содержащего целые числа */
void Pow_file(void); /* замена отрицательных значений в
файле их квадратами */
void Out_file(void); /* вывод содержимого бинарного файла 
на экран */

int main(void)
{
   int key = 0;
   srand(time(0));
   while(key!=52)
   {
      system("CLS");
      printf("Menu:\n\t1 - Create file gen press \
         \n\t2 - Output file\n\t3 - Change file \
         \n\t4 - Exit\n");
      key = getchar();
      if (key==49) Gen_press();
      if (key==50) Out_file();
      if (key==51) Pow_file();
   }
   return 0;
}
void Gen_press(void)
{ /* заполнение файла с помощью генератора случайных чисел */
   int k = 0, n = 0;
   FILE *fin;
   fin = fopen("datfile.dat", "wb");
   if(!fin)
   {
     printf("Can not create binary file\n");
     system("pause");
     exit(0);
   }
   k = rand()%100+1; /* случайное количество чисел */
   while(k)
   {
     n = rand()%101 - 50; /* случайное число от -50 до 50 */
     fwrite(&n, sizeof(n), 1, fin); /* запись числа */
     k--;
   }
   fclose(fin);
   printf("\n\nFile create\nPress any key...\n");
   system("pause");
}
void Out_file(void) 
{/* вывод содержимого файла на экран */
   int n = 0;
   FILE *fin;
   fin = fopen("datfile.dat", "rb");
   if(!fin)
   {
      printf("Can not open binary file\n");
      system("pause");
      exit(0);
   }
   printf("\n\nIn file: \n");
   while(fread(&n, sizeof(n), 1, fin)) /* читаем из 
файла числа, пока есть, что читать */
   {
      printf("%5d", n); /* и выводим на экран */
   }
   fclose(fin);
   printf("\nPress any key...\n");
   system("pause");
}
void Pow_file(void)
{ /* изменение содержимого файла */
   int n = 0;
   long k;
   FILE *fin;
   fin = fopen("datfile.dat", "r+b");
   if(!fin)
   {
      printf("Can not open binary file\n");
      system("pause");
      exit(0);
   }
   rewind(fin);
   while(fread(&n, sizeof(n), 1, fin)) /* читаем из 
файла числа, пока есть, что читать */
   {
      if (n<0) /*если число отрицательное */
      {
        n*=n; /* возводим его в квадрат */
        fseek(fin, ftell(fin)-sizeof(n), SEEK_SET);
        /* возврат к началу блока, содержащего это число */
        fwrite(&n, sizeof(n), 1, fin);
        /* запись измененного значения */
        fseek(fin, ftell(fin), SEEK_SET);
        /* повторно используем fseek() для перехода от записи 
к чтению, положение указателя текущей позиции 
не меняется */
      }
   }
   fclose(fin);
   printf("\n\nFile change!\nPress any key...\n");
   system("pause");

Пример 4. Дан файл, содержащий сведения о клиентах одного кредитора. Структура записи: ФИО, номер телефона, возраст, сумма. Получить сведения о самом старом клиенте, задолжавшем более указанной суммы.

#include <stdio.h>
main()
{
   FILE *f;
   int x,k=0;
   char c;
   f=fopen("int.txt","r");
   if (!f) /* если не открылся исходный файл */
   {  /* сообщаем об ошибке */
      printf("Can not open text file\n"); 
      system ("pause");
      return 0; /* прерываем программу */
   }
   while (!feof(f)) /* пока не конец файла */
   {
      fscanf(f,"%d",&x); /* читаем число */
      k++;    /* увеличиваем счетчик */
      c=fgetc(f); /* читаем символ – разделитель чисел */
      if (c=='\n'||c==EOF) /* если достигнут конец строки 
                            или конец файла */
      {
         printf("%d  ",k); /* выводим значение счетчика 
                             на экран */
         k=0;  /* обнуляем счетчик для следующей строки */
      }
   }
   fclose(f);
   return 0;
}