Как дополнить логику замены символа табуляции на любой другой символ

возникла проблема с тем что я пытаюсь заменить символ табуляции, в котором 2 символа пробела - на другой символ, но при замене я получаю один символ вместо двух и я понимаю что проблема в логике программы, как её можно дополнить? Трудность идеи ещё в том что я читаю файл, а затем перезаписываю его новым содержимым и возникает путаница с позициями функции fseek

Вот небольшой пример:

#include <stdio.h>

#define TABN 2
int main(int argc, char **argv)
{
    int c;
    FILE *stream;

    /* в аргументе к программе передается путь файла */
    if (argc > 1) {
        /* открыть файл для чтения и его преобразования */
        if ((stream = fopen(argv[1], "r+")) != NULL) {
            while ((c = fgetc(stream)) != EOF) {
                if (c == '\t') {
                    fseek(stream, -1, SEEK_CUR);
                    fputc('#', stream);
                }
            }

            fclose(stream);
        } else
            perror("Error");
    }

    return 0;
}

В моем файле лежит строка (первый отступ это табуляция из 2 символов пробела):

   abc

И после выполнения программы я получаю

#abc

А хотелось бы увидеть

##abc

Как этого добиться? И да я знаю что в табуляции обычно 8 символов пробела, пример для более простого понимания


Ответы (1 шт):

Автор решения: Harry

Вообще-то табуляция не есть какое-то конкретное количество символов. Табуляция в N символов, каковое N может быть разным у разных вьюверов/редакторов, означает, что следующий символ будет в ближайшей позиции, превышающей текущую и кратную N.

Так что в общем случае вам нужно читать строками, в каждой строке разбираться, сколько пробелов добавить - например, при табуляции 4 символа строка

\tab\tcd

превращается в

####ab##cd

т.е. символы табуляции заменяются на разное количество других символов.

Простая замена в файле теперь не сработает, так что лучше писать в другой файл, которым затем заменить исходный...

→ Ссылка