Чтение текстового файла до определенного символа - PullRequest
6 голосов
/ 20 марта 2011

Вот моя дилемма.У меня есть файл, и я хочу прочитать все символы до тех пор, пока программа не нажмет «#», и проигнорировать все в этой строке после «#».Например,

0 4001232 0 #комментарий, сброс

Это расстраивает, так как кажется, что есть очень простое решение.Спасибо!

Ответы [ 5 ]

2 голосов
/ 05 июля 2014
FILE *f = fopen("file.txt", "r");
int c;
while ((c = getc(f)) != '#' && c != EOF)
   putchar(c);
1 голос
/ 20 марта 2011

Существует множество способов и примеров того, как это сделать.Обычно идея состоит в том, чтобы иметь переменную, которая хранит состояние (до #, после #, после \ n и т. Д.) И работать в цикле while до EOF.пример, который вы можете увидеть здесь это программа для удаления комментариев C, но идея та же самая.

0 голосов
/ 24 марта 2011

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

Если, тем не менее, вам нужно или вы хотите сделать это внутри своего кода, тогда общий метод для этого, как уже упоминалось, для сохранения текущего состояния ви обрабатывать любой новый персонаж в соответствии с состоянием.Это очень хороший общий метод, и он настоятельно рекомендуется, особенно если требуется больше предварительной обработки.

Если, однако, это абсолютно единственное, что вам нужно делать, чем вы можете сделатьчто-то немного лучше и отказаться от состояния с кодом, подобным этому:

do {
   // Initialize things (buffer for the characters maybe) per line
   ch = fgetc(input_file);
   while ( (ch != EOF) && (ch != '\n') && (ch != '#') ) // Assuming # is the comment character
   {
        // Do something with 'ch', save it to a buffer, give it to a function - whatever
        ch = fgetc(input_file);
   }
   // If you save the characters to a buffer, this will be a good time to do something with it
   while ( (ch != EOF) && (ch != '\n') ) ch = fgetc(input_file); // Read the rest of the line
while ( ch != EOF );
0 голосов
/ 20 марта 2011

Прочитайте строку, используя fgets , читайте эту строку, пока не получите символ '#'.

Прочитайте другую строку ...

0 голосов
/ 20 марта 2011

Решение зависит от того, как вы «читаете» это.

Я мог бы, например, просто удалить все эти комментарии с sed 's/#.*//' <infile >outfile в bash.

РЕДАКТИРОВАТЬ: Однако,если бы я выполнял синтаксический анализ вручную, я мог бы просто (в моем цикле синтаксического анализа) иметь

if(line[i]=='#') {
    continue;
}

, который прекратил бы анализ этой строки, выйдя из цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...