C: Разбор файла без потери пробела - PullRequest
2 голосов
/ 21 марта 2012

Я анализирую файл для конкретного соответствия ключевых слов программой C, вот мой пример кода ...

#include <stdio.h>

int main() { 

    FILE *infile = fopen("Somefile.txt", "r");

    char buffer[256];
    char value[128];

    while (fgets(buffer, sizeof(buffer), infile))
        if (1 == sscanf(buffer, " x = %s", value))
            printf("Value = %s\n", value);
    return 0;
}

Somefile.txt

some junk
#a comment
a = 1 ; a couple other variables.
b = 2
x = 3
 x = 4
x=5
x = Hi hello

Выход:

Value = 3
Value = 4
Value = 5
Value = Hi

Проблема: когда x содержит значение типа «Hi Hello», тогда он просто анализирует только «Hi», я хочу проанализировать все значение x без потери пробела.

Пожалуйста, предложите мне решение для этого.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

В этой строке вашего кода:

if (1 == sscanf(buffer, " x = %s", value))

%s означает чтение одним словом.

Если вы хотите прочитать в остальной части строки, используйте %[^\n]s, например:

if (1 == sscanf(buffer, " x = %[^\n]s", value))
0 голосов
/ 21 марта 2012

Первое, что нужно сделать, это вернуться на sscanf. Если вы прочитаете man-страницу, scanf рассматривает пробелы как спецификации, которые говорят: «у вас будет пробел, это не важно». Тогда другие символы являются спецификациями для литералов . В результате эта спецификация формата выглядит как «любое количество пробелов, затем x, затем больше пробелов, затем« = », затем больше пробелов, затем строка, и теперь возвращается строка».

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

while not end of file
   while not end of line
      get next character
      if char == ";" -- comment
         break
      if char is a letter
         parse an assignment

и так далее.

...