Хрестоматия по программированию на Си в Unix



Текстовая обработка. Хрестоматия по программированию на Си в Unix - стр. 6


Напишите программу, которая читает файл, состоящий из "блоков" текста, разделенных пустыми строками. Размер "блока" ограничен. Программа готовит файл для печати на принтер так, чтобы ни один блок не разбивался на части:

----------- ---------- |###### A | |###### A | лист1 |#### A | превращать |#### A | |##### A | в |##### A | | | | | |###### B | | | ----------- ---------- |#### B | |###### B | лист2 | | |#### B | ... | |

то есть если блок не умещается на остатке листа, он должен быть перенесен на следующий лист. Блоки следует разделять одной пустой строкой (но первая строка листа не должна быть пустой!). Если блок длиннее страницы - не переносите его.

/* Решение задачи о переносе блоков текста, * если они не умещаются на остатке листа */

#include <stdio.h>

#include <ctype.h>

extern void *malloc(unsigned); extern int atoi(char *); FILE *fpin = stdin, *fpout = stdout;

/* Спасти строку в динамически выделенной памяти */ char *strdup (const char *s) { char *ptr = (char *) malloc (strlen (s) + 1); if( ptr ) strcpy (ptr, s); return ptr; } int page_length = 66; /* длина страницы */ int current_line; /* текущая строка на странице (с нуля) */ int numbered = 0; /* нумеровать строки листа ? */ #define MAXLINES 256 /* макс. длина блока */ int stored = 0; /* запомнено строк */ char *lines[MAXLINES]; /* запомненные строки */

/* Запомнить строку блока в буфер строк */ void remember (char *s) { if (stored >= MAXLINES) { fprintf (stderr, "Слишком длинный блок.\n"); return; } else if((lines[stored++] = strdup (s)) == NULL ){ fprintf (stderr, "Мало памяти (Out of memory).\n"); exit(13); } }

/* Переход на следующую страницу */ void newpage () { current_line = 0; putc('\f', fpout); }

/* Перевод строки или листа */ void newline (void) { if (current_line == page_length - 1) newpage (); /* начать новый лист */ else { current_line++; if( numbered ) fprintf(fpout, "%02d\n", current_line); else putc ('\n', fpout); } }




Содержание  Назад  Вперед