Вы также можете использовать strcspn
, чтобы обрезать все комментарии (и, если их нет, обрезать окончания строк из вашего буфера) за один простой вызов. Где вы обычно обрезаете конец строки из буфера, считанного fgets()
с помощью:
ch[strcspn (ch, "\r\n")] = 0; /* trim line-ending */
Вы можете просто добавить символ "#"
в список reject и nul-terminate там, если есть комментарий. Это уменьшило бы полную задачу удаления комментариев, начинающихся с '#'
и вывода новой отформатированной строки:
while (fgets (ch, BUFSIZE, fp)) { /* read every line */
ch[strcspn (ch, "#\r\n")] = 0; /* trim comment or line-ending */
puts (ch); /* output line w/o comment */
}
Короткий пример, в котором файл читается как первый аргумент программы (или читается из stdin
по умолчанию, если аргумент не указан), вы можете сделать:
#include <stdio.h>
#include <string.h>
#define BUFSIZE 1024 /* if you need a constant, #define one (or more) */
int main (int argc, char **argv) {
char ch[BUFSIZE];
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
while (fgets (ch, BUFSIZE, fp)) { /* read every line */
ch[strcspn (ch, "#\r\n")] = 0; /* trim comment or line-ending */
puts (ch); /* output line w/o comment */
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
return 0;
}
Пример входного файла
Заимствование файла примера Тома :)
$ cat dat/comments_file.txt
#Paths
A B #Path between A and B.
D C #Path between C and D.
E F
G H
Пример использования / Вывод
$ ./bin/comments_remove <dat/comments_file.txt
A B
D C
E F
G H
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.