Выровнять строки в файле по правой и левой границе, вставляя между словами пробелы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Задача: Выравнять строки в файле по правой и левой границе, вставляя между словами пробелы. Длинна строки 80 символов. (Это как выравнивание по ширине в ворде, если я правильно понял условие). В функция main () используется для вызова функций открытия файла, транзакции файла и закрытия файла . Нужна помощь с транзакцией. Не могу понять алгоритм для реализации выравнивания.

Решение задачи: «Выровнять строки в файле по правой и левой границе, вставляя между словами пробелы»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <assert.h>
#include <stdlib.h>
 
#define MAXWIDTH 120
#define MAXWORDS MAXWIDTH/2
 
bool justify_string(char *src, char *dst, int width);
void justify_file(const char *srcFileName, const char *dstFileName, int width);
 
int main()
{
    justify_file("in.txt", "out.txt", 80);
}
 
bool justify_string(char *src, char *dst, int width)
{
    assert(width <= MAXWIDTH);
    assert(src != NULL && dst != NULL);
 
    static char wordList[MAXWORDS][MAXWIDTH+1];
 
    int i;
    int totalWordsLength = 0; // суммарная длина всех слов
 
    char *word = strtok(src, " "); // выделяем первое слово
 
    for (i = 0; word != NULL && i < MAXWORDS; i++)
    {
        totalWordsLength += strlen(word);
        if (totalWordsLength + i > width)
            return false;
 
        strcpy(wordList[i], word);
        word = strtok(NULL, " "); // выделяем следующее слово
    }
 
    const int numberOfWords = i;
 
    if (word != NULL || numberOfWords < 2)  return false;
 
    const int totalSpacesLength = width - totalWordsLength;
    const int numberOfSpaces = numberOfWords-1;
    const int minimumSpaceLength = totalSpacesLength / numberOfSpaces;
    const int additionalSpaces = totalSpacesLength - minimumSpaceLength*numberOfSpaces;
 
    int spaceLength = minimumSpaceLength + 1;
    i = 0;
 
    for (int iWord = 0; iWord < numberOfWords; iWord++)
    {
        int j = 0;
        // копируем слово в выходну строку
        while (wordList[iWord][j] != '\0')
            dst[i++] = wordList[iWord][j++];
 
        if (iWord == additionalSpaces)
            --spaceLength;
 
        if (iWord < numberOfSpaces) // если это не последнее слово
        {
            // добавляем нужное число пробелов после слова
            for (int k = 0; k < spaceLength; k++)
                dst[i++] = ' ';
        }
    }
 
    assert(i == width);
    dst[i] = '\0';
    return true;
}
 
void justify_file(const char *srcFileName, const char *dstFileName, int width)
{
    FILE *in  = fopen(srcFileName, "r");
    FILE *out = fopen(dstFileName, "w");
 
    if (!in || !out) {
        puts("Error opening file.");
        exit(1);
    }
 
    const int BufLength = 200;
    char s[BufLength], s2[BufLength];
    char justifiedString[MAXWIDTH+1];
 
    while (fgets(s, BufLength, in))
    {
        // сохраняем копию строки, поскольку функция strtok портит строку
        strcpy(s2, s);
 
        bool success = justify_string(s, justifiedString, width);
 
        if (success)  fputs(justifiedString, out);
        else          fputs(s2, out);
    }
 
    fclose(in);
    fclose(out);
}

Объяснение кода листинга программы

Код предназначается для выравнивания строк в файле по правой и левой границе, вставляя между словами пробелы. Он написан на языке C и использует следующие библиотеки: stdio.h, string.h, stdbool.h, assert.h и stdlib.h. Код содержит две основные функции: justify_string и justify_file. justify_string принимает три параметра: src, dst и width.

  • src - исходная строка, которую необходимо выровнять.
  • dst - выходная строка, в которую будет скопирован результат.
  • width - желаемая ширина итоговой строки. Функция использует статический массив wordList для хранения слов из входной строки. Она проходит по строке, разделяя ее на отдельные слова с помощью функции strtok. Затем она проверяет, не превышает ли суммарная длина всех слов ширину итоговой строки. Если превышает, то возвращается значение false. Затем функция выделяет пробелы одинаковой длины между словами. Если в строке осталось дополнительное количество пробелов, они удаляются. Каждое слово копируется в выходную строку, а затем добавляются пробелы. justify_file - это функция, которая открывает исходный файл для чтения и результирующий файл для записи. Затем она читает строки из исходного файла, выравнивает их с помощью функции justify_string и записывает результат в результирующий файл. В основной функции программы main() вызывается функция justify_file(), передавая ей имя исходного файла in.txt, имя результирующего файла out.txt и желаемую ширину строки 80.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы