Отредактировать текст так, чтобы все строки, кроме последней, имели фиксированную длину - C (СИ)
Формулировка задачи:
Задание:
Дан файл *.txt с произвольным текстом объемом не менее 1000 символов. Отредактировать текст так, чтобы все строки, кроме последней, имели фиксированную длину. Результаты редактирования сохранить в файле *.txt, исходный файл сохранить как *.bak. Правила редактирования:
- слова не переносятся,
- знак препинания не отделяется от слова, за которым он стоит,
- строки выравниваются за счет равномерно вставляемых пробелов.
То, что есть на данный момент:
Текст из файла я занес массив, но никак не могу придумать, что с ним делать дальше. Помогите советом. )
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#pragma warning(disable : 4996)
int main(int argc, char *argv[])
{
FILE * fp= fopen("F:\\laba.txt","r");
FILE * fp2= fopen("F:\\labaa.bak","w+");
int n,k=0;
if (fp==NULL)
{
printf("File wasn't open!\n");
return 0;
}
else
{
char str[1024] = "";
char str2[1024] = "";
while(!feof(fp))
{
fgets(str, 1024, fp);
printf("waite...");
for(int i=0; i<sizeof(str); i++)
{
str2[i]=str[i];
char * a = &str2[i];
fputs(a,fp2);
k++;
}
break;
}
printf("\n%d\n",k);
fclose(fp2);
fclose(fp);
return 0;
}
}
Извиняюсь за тему, случайно вышло.
Решение задачи: «Отредактировать текст так, чтобы все строки, кроме последней, имели фиксированную длину»
textual
Листинг программы
#include <stdio.h>
int main ()
{
FILE *fp;
fp=fopen ("input.txt", "r");
int m=0, k=0, i;
//ищем m-длину максимальной строки
do
{
while ((getc(fp)!='\n') && (!feof(fp)))
k++;
if (k>m) m=k;
k=0;
} while (!feof(fp));
rewind (fp);
FILE *fp_out;
fp_out=fopen ("output.txt", "w");
int space, len, beginning_line; //кол-во пробелов, длина и указатель на начало текущей строки
char c;
do
{
space=len=0;
beginning_line=ftell (fp);
//считаем количество пробелов
while (((c=getc(fp))!='\n') && (!feof(fp)))
{
if (c==' ') space++;
len++;
}
fseek (fp, beginning_line, SEEK_SET);
while (((c=getc(fp))!='\n') && (!feof(fp)))
{
if (c!=' ') fprintf (fp_out, "%c", c);
else
{
if ((m-len)%space) {k=(m-len)/space+2; len++;} //+1 исходный пробел, +1 пробел от остатка деления
else k=(m-len)/space+1; //+1 что бы сохранить исходный пробел, на который выводим
for (i=0; i<k; i++)
fprintf (fp_out, " ");
}
}
fprintf (fp_out, "\n");
} while (!feof(fp));
fclose (fp);
fclose (fp_out);
return 0;
}
Объяснение кода листинга программы
- Включаем файл с объявлениями стандартных функций
- Объявляем функцию main() как точку входа в программу
- Открываем файл input.txt для чтения
- Инициализируем переменные m=0, k=0, i=0
- Находим длину максимальной строки путем чтения файла до конца и сохранения количества символов в переменной k
- Сбрасываем указатель обратно на начало файла
- Открываем файл output.txt для записи
- Инициализируем переменные space=0, len=0, beginning_line=0
- Читаем каждый символ из файла до конца строки, считая количество пробелов
- Если длина строки меньше максимальной, выводим каждый символ, кроме пробелов, в файл output.txt
- Если длина строки равна максимальной, вычисляем количество пробелов, которые нужно добавить, чтобы заполнить строку до максимальной длины
- Добавляем необходимое количество пробелов в файл output.txt
- Выводим символ новой строки в файл output.txt
- Повторяем шаги 9-13 для каждой строки в файле
- Закрываем файлы input.txt и output.txt
- Возвращаем 0, чтобы указать, что программа успешно завершилась