Вставка пробелов в файл - C (СИ)

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

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

В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов (пробелы в строке должны быть вставлены равномерно). В общем начал писать программу, ниже код:
//---------------------------------------------------------------------------
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
#include <stdio>
#include <stdlib>
 
int main(int argc, char* argv[])
{
        char str[1000];
        int i, j;
        FILE *file;
        file = fopen("a.txt", "a+");
 
        /*Выводим содержимое файла*/
        printf("Soderjanie faila:\n");
        fgets(str, 1000, file);
        puts(str);
 
        /*Если файл пуст - заполнение пробелами*/
        if (fscanf(file, "%c", str) < 1)
        {
                printf("File pust! Zapolnenie probelami...\n\nGotovo!");
                for (i = 0; i < 10; i++)
                {
                        for (j = 0; j < 80; j++)
                        {
                                fputc(' ', file);
                                if ((i == 9) && (j == 79))
                                        fclose(file);
                        }
                        fputc('\n', file);
                }
        }
        else
        {
                printf("File ne pust! Zapolnenie probelami...\n\nGotovo!");
                fclose(file);
        }
        getchar();
        return 0;
}
//---------------------------------------------------------------------------
Здесь рассмотрен случай, если файл пуст. Но также файл может быть и с содержимым. Я думаю, что содержимое str[1000] просматривается на строки, в которых будут три случая. Если строка файла <80, =80 и >80. Т.е.
for(i = 0; i < 1000; i++)
{
        if (str[i] == '\n') // <80
        {
                k = i;
                /*Код*/
        }
        /*Остальные три случая*/
}
В общем прошу помощи.. подсказать как лучше организовать будет эти три случая) Я так понимаю, что ещё в каждом случае будет по 3 случая. Т.е., если (str[i] == ' ')&&(str[i]==' '), если (str[i] == ' ')&&(str[i]!=' '), если (str[i] != ' '). Эти три подслучая, лучше подпрограммой сделать?. P.S. Пользовался поиском - ничего толкового не нашел.

Решение задачи: «Вставка пробелов в файл»

textual
Листинг программы
//---------------------------------------------------------------------------
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
#include <stdio>
#include <stdlib>
#include <string>
 
int main(int argc, char* argv[])
{
        char str[1000];
        int i, j, k = 0, r, p;
        FILE *file;
        FILE *file2;
        char *a[5] = {"a.txt"};
        char *b[5] = {"b.txt"};
        file = fopen(*a, "r"); // Îòêðûòèå ГґГ*éëГ*
        file2 = fopen(*b, "a");
 
        /*ÏðîâåðêГ* Г*Г* äîñòóïГ*îñòü îòêðûòèÿ ГґГ*éëГ**/
        if (!file)
        {
                fprintf(stderr, "Ne mogu otkrit fail\n");
                getchar();
                //fclose(file);
                exit(1);
        }
 
        /*Âûâîäèì ñîäåðæèìîå ГґГ*éëГ**/
        printf("Soderjanie faila:\n");
        while (fgets(str, 80, file) != NULL)
        {
                printf("%s", str);
                r = strlen(str);
                printf("\n%d", r);
                if (str[r-1] == '\n')
                {
                        k = 1;
                        j = 81;
                }
                else
                {
                        k = 0;
                        j = 80;
                }
                if (r < j) // Åñëè ГҐГ±ГІГј ñâîáîäГ*ûå ìåñòГ* Гў ñòðîêå
                {
                        if (k == 1) // Ñìîòðèì ГҐГ±ГІГј ëè Гў ýòîé ñòðîêå ГЄГ*ðåòêГ*
                                p = 81 - r; // Ñ÷èòГ*ГҐГ¬ êîëè÷åñòâî ñâîáîäГ*ûõ ìåñò
                        else
                                p = 80 - r;
                                                printf("\n%d", k);
                        i = r; // ÏåðåêèäûâГ*ГҐГ¬ Г±Г·ГҐГІГ·ГЁГЄ Г*Г* ïåðâîå ñâîáîäГ*îå ìåñòî ñòðîêè
 
                        while (p > 1)
                        {
                                str[i] = ' ';
                                i++;
                                p--;
                        }
 
                        if (k == 1) // Åñëè ГҐГ±ГІГј ГЄГ*ðåòêГ*, ГІГ® ïåðåñòГ*âëÿåì ГҐВё
                        {
                                str[r-1] = ' ';
                                str[80] = '\n';
                        }
                }
                fputs(str, file2);
                k = 0;
 
        }
 
 
 
 
        fclose(file);
        fclose(file2);
        getchar();
        return 0;
}
//---------------------------------------------------------------------------

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

В данном коде выполняется вставка пробелов в файл.

  1. Создаются две переменные file и file2, которые используются для работы с файлами.
  2. Переменная k инициализируется значением 0, а переменная p пока не используется.
  3. В цикле while считывается каждая строка из первого файла file.
  4. В каждой строке подсчитывается количество символов (r), и если последний символ строки - это символ новой строки (\n), то значение переменной k меняется на 1, а значение переменной p вычисляется как разница между максимальным количеством пробелов, которые можно вставить в строку (81 - r), и текущим количеством пробелов, которые уже вставлены (i).
  5. Если k равно 1, то в текущую строку вставляется пробел вместо последнего символа.
  6. После завершения цикла while для каждой строки, значение переменной k сбрасывается обратно в 0.
  7. Вставленные строки записываются во второй файл file2.
  8. После завершения работы с файлами, они закрываются, и программа завершается.

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

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