Отредактировать текст так, чтобы все строки, кроме последней, имели фиксированную длину - 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, чтобы указать, что программа успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д