Дополнить программу: Форматный файловый ввод-вывод
Помогите дополнить программу на СИ, которая читает текстовый файл и выполняет такое преобразование его, какое задано в задании.
Примечания:
- Имя файла, который подлежит обработке, должно быть параметром программы.
- Файл должен иметь не менее 10-15 строк текста.
- Допускается ограничить максимальную длину строки в тексте 80 символами.
- Допускается (если в индивидуальном задании не оговорено второе) считать, что слова разделяются пробелами, а знаки препинания рассматривать как буквы.
- Программу следует разрабатывать, исходя из предположения, что весь текст из файла не может быть размещен в оперативной памяти.
- Допускается создавать при выполнении программы временные файлы, которые, однако, не должны сохранятся после окончания программы.
Основная часть программы есть, необходимо только дополнить часть в программе только по заданию: "Разместить текст в несколько столбцов, так чтобы 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;
}
Спасибо!