Преобразовать файл, чтобы все строки имели длину, не превышающую длину наименьшей - 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 продолжается до тех пор, пока не будут обработаны все элементы списка.