Преобразовать файл, чтобы все строки имели длину, не превышающую длину наименьшей - C (СИ)
Формулировка задачи:
Здравствуйте!
Помогите с алгоритмом задачи:
Дан текстовый файл. Преобразовать его таким образом, чтобы все строки имели длину, не превышающую длину его наименьшей строки. Лишние символы при необходимости переносятся в строки, расположенные ниже.
С такими структурами как списки, особенностью которых является то, что они помимо данных хранят еще и ссылку на след/пред элемент, особо не шарю.
Вот функция чтения из файла:
#include <stdio.h> #include <conio.h> #include <string.h> #include <alloc.h> #include <stdlib.h> typedef struct list { char s; int i; struct list *next; } LIST; LIST *head=0; LIST *read_list(LIST *lst) { LIST *p; FILE *file; file=fopen("ishodn.txt", "r"); if (file) { lst=(LIST *)malloc(sizeof(LIST)); p=lst; while (1) { p->s=fgetc(file); if (!feof(file)) { p->next=(LIST *)malloc(sizeof(LIST)); p=p->next; } else break; } p->next=NULL; } else printf("file error \n"); fclose(file); return lst; }
Решение задачи: «Преобразовать файл, чтобы все строки имели длину, не превышающую длину наименьшей»
textual
Листинг программы
void OutListStr(long n, LIST list) { long count = 0, waitflg = 0; LIST *ptr = &list; // 3десь открываешь файл, FILE *F; while (ptr != NULL) { if (count < n) { if (ptr->s == '\n') { fputc(ptr->s, F); count = 0; } else { fputc(ptr->s, F); count++; } } else { if (ptr->next!=NULL && ptr->next->s != '\n') fputc('\n', F); ptr = ptr->next; } } }
Объяснение кода листинга программы
- Входные данные: n (количество строк, которые нужно вывести) и LIST list (список строк).
- Создаются две переменные: count (счетчик количества выводимых символов) и waitflg (флаг ожидания).
- Указатель ptr начинает свое движение по списку.
- В цикле while (ptr != NULL) происходит обход всех элементов списка.
- Если текущий элемент не является последним (т.е. у него есть следующий элемент), и текущий элемент не является символом новой строки ('\n'), то он выводится на экран.
- Если текущий элемент является символом новой строки ('\n'), то счетчик count сбрасывается в ноль.
- Если текущий элемент не является символом новой строки ('\n'), то он выводится на экран, а счетчик count увеличивается на единицу.
- Если текущий элемент является символом новой строки ('\n'), и следующий элемент не является символом новой строки ('\n'), то на экран выводится символ новой строки ('\n').
- Указатель ptr перемещается на следующий элемент списка.
- Цикл while продолжается до тех пор, пока не будут обработаны все элементы списка.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д