Дополнить программу: Форматный файловый ввод-вывод

Помогите дополнить программу на СИ, которая читает текстовый файл и выполняет такое преобразование его, какое задано в задании.

Примечания:

  1. Имя файла, который подлежит обработке, должно быть параметром программы.
  2. Файл должен иметь не менее 10-15 строк текста.
  3. Допускается ограничить максимальную длину строки в тексте 80 символами.
  4. Допускается (если в индивидуальном задании не оговорено второе) считать, что слова разделяются пробелами, а знаки препинания рассматривать как буквы.
  5. Программу следует разрабатывать, исходя из предположения, что весь текст из файла не может быть размещен в оперативной памяти.
  6. Допускается создавать при выполнении программы временные файлы, которые, однако, не должны сохранятся после окончания программы.

Основная часть программы есть, необходимо только дополнить часть в программе только по заданию: "Разместить текст в несколько столбцов, так чтобы n-ое слово i-ой строки размещалось под n-ым словом i+1-ой строки".

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char filename[80];     /* имя файла */
char bu1[81], bu2[81]; /* входной и выходной буферы */
 
int main(int an, char *av[]) {
 char *b1, *b2; /* текущие указатели в буферах */
 char os;       /* предыдущий символ */
 FILE *inf, *outf;  /* файловые переменные */
 int  l,        /* текущая длина строки */
      lmax,     /* максимальная длина строки */
      lm;       /* макс. длина строки (рабочая) */
 int  nw,       /* количество слов */
      nb;       /* количество пробелов */
 
  /* проверка параметров */
  if (an<2) {
    printf("Не задан параметр вызова\n");
    exit(0);
    }
  strcpy(filename,av[1]);
  /* открытие файлов */
  if ((inf=fopen(filename,"r"))==NULL) {
    printf("Невозможно открыть файл: %s\n",filename);
    exit(0);
    }
  if ((outf=fopen("TMP","w"))==NULL) {
    printf("Невозможно создать файл: TMP\n");
    exit(0);
    }
  /* первая фаза - определение максимальной длины */
  /* чтение файла строка за строкой */
  for (lmax=0; fgets(bu1,80,inf)!=NULL; ) {
    /* удаление из строки лишних пробелов 
       и определение количества слов */
    for (os=' ',nw=0,b1=bu1, b2=bu2; *b1; os=*b1++) {
      switch(*b1) {
        case 0xA: /* символ новой строки удаляется */
          break;
        case ' ': /*2-й пробел подряд удаляется */
          if (os==' ') break;
        default: /* остальные символы переписываются */
          if (os==' ') nw++; /* начало слова */
          *b2++=*b1;
          break;
          }
        }
    /* удаление пробела в конце */
    if ((b2>=bu2)&&(*(b2-1)==' ')) *(b2-1)=0;
    else *b2=0;
    /* вывод в файл количества слов и строки */
    fprintf(outf,"%02d %s\n",nw,bu2);
    /* определение максимальной длины */
    l=strlen(bu2);
    if (l>lmax)lmax=l;
    }
  fclose(inf);
  fclose(outf);
 
  /* вторая фаза - окончательная обработка */
  /* открытие промежуточного файла */
  if ((inf=fopen("TMP","r"))==NULL) {
    printf("Невозможно открыть файл: TMP\n");
    exit(0);
    }
  /* открытие выходного файла out.txt */
  if ((outf=fopen("out.txt","w"))==NULL) {
    printf("Невозможно открыть файл: %s\n","out.txt");
    exit(0);
    }
  /* чтение файла строка за строкой */
  while (fgets(bu1,80,inf)!=NULL) {
    /* виделение количества слов и текста */
    bu1[2]=0; nw=atoi(bu1);
    b1=bu1+3;
    l=strlen(b1)-1; b1[l]=0;
    /* если слов 1 или 0 - строка остается как есть  */
    if (--nw>0) {
      /* определение количества пробелов между словами */
      nb=(lmax-l)/nw;
      for (lm=lmax, b2=bu2; *b1; l--,lm--) {
        /* перезапись символов на выход */
        if ((*b2++=*b1++)==' ') {
          /* если конец слова - добавить пробели */
          for (; nb; nb--) { lm--; *b2++=' ';}
          /* коррекция количества пробелов между словами */
          if (--nw) nb=(lm-l)/nw;
          }
        }
      /* признак конца строки в выходном буфере */
      *b2=0;
      /* вывод в файл */
      fprintf(outf,"%s\n",bu2);
      }
    /* вывод строки, которая осталась без изменений */
    else fprintf(outf,"%s\n",b1);
    }
  fclose(inf);
 
  fclose(outf);
  /* уничтожение промежуточного файла */
  unlink("TMP");
 
  return 0;
}

Спасибо!


Ответы (0 шт):