Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Купить рекламу на форуме 15-35 тыс рублей в месяц

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

           Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
           И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - https://clck.ru/fCqwP

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2022, 21:56   #1
Aleksey7754
 
Регистрация: 22.05.2022
Сообщений: 5
Восклицание Дополнить программу: Форматный файловый ввода-вывод

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

Примечания:
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;
}
Вложения
Тип файла: txt inf.txt (767 байт, 1 просмотров)
Aleksey7754 вне форума Ответить с цитированием
Ответ

           Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
           Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переделать программу под файловый ввод и вывод на С ImmortalisNox Помощь студентам 4 09.12.2017 21:21
Форматный ввод / вывод в языке С / С ++ andriy1048 Помощь студентам 6 27.09.2015 12:26
Форматный ввод-вывод JeyKip Общие вопросы C/C++ 3 19.09.2009 17:26
Форматный ввод/вывод Lazio Общие вопросы C/C++ 4 03.03.2009 19:29