Как дополнить логику замены символа табуляции на любой другой символ
возникла проблема с тем что я пытаюсь заменить символ табуляции, в котором 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 шт):
Вообще-то табуляция не есть какое-то конкретное количество символов. Табуляция в N символов, каковое N может быть разным у разных вьюверов/редакторов, означает, что следующий символ будет в ближайшей позиции, превышающей текущую и кратную N.
Так что в общем случае вам нужно читать строками, в каждой строке разбираться, сколько пробелов добавить - например, при табуляции 4 символа строка
\tab\tcd
превращается в
####ab##cd
т.е. символы табуляции заменяются на разное количество других символов.
Простая замена в файле теперь не сработает, так что лучше писать в другой файл, которым затем заменить исходный...