2009-11-10 2 views
0

Это вопрос «как разобрать конфигурационный файл». В основном у меня есть текстовый файл (/ etc/myconfig), который имеет все настройки. Мне нужно прочитать этот файл и найдите строку:Найдите строку в текстовом файле и проанализируйте эту строку (Linux, C)

wants_return=yes 

однажды я найти эту строку, мне нужно, чтобы разобрать его и вернуть только то, что после знака равенства. Я попытался использовать комбинации fgets и strtok, но я запутался здесь. В любом случае, кто-нибудь знает функцию, которая может это выполнить?

Код приветствуется.

благодаря

+0

Что не так с 'fgets()' и 'strtok()'? Что вы получаете и чего вы ожидаете? – pmg

+0

Было бы полезно предоставить примерный код того, что вы сделали, и объяснение того, как оно не соответствует вашим ожиданиям. – luke

+0

strtok никогда не возвращает строку после знака равенства. Я не собираюсь публиковать 100 строк кода. Извините – wonderer

ответ

2

Это работает: (примечание: Я уверен, если fgets должен включать символ новой строки в возвращаемой строке, если это не так, вы можете оставить чек на него)

#include <stdio.h> 

const unsigned MAXLINE=9999; 
char const* FCFG="/etc/myconfig"; 
char const* findkey="wants_return="; 


char * skip_ws(char *line) 
{ 
    return line+strspn(line," \t"); 
} 

char * findval(char *line,char const* prefix,int prelen) 
{ 
    char *p; 
    p=skip_ws(line); 
    if (strncmp(p,prefix,prelen)==0) 
     return p+prelen; 
    else 
     return NULL; 
} 

char *findval_slow(char *line,char const* prefix) 
{ 
    return findval(line,prefix,strlen(prefix)); 
} 

int main() { 
    FILE *fcfg; 
    char line[MAXLINE]; 
    char *p,*pend; 
    int findlen; 

    findlen=strlen(findkey); 

    fcfg=fopen(FCFG,"r"); 

    while (p=fgets(line,MAXLINE,fcfg)) { 
     printf("Looking at %s\n",p); 
     if (p=findval(line,findkey,findlen)) { 
      pend=p+strlen(p)-1; /* check last char for newline terminator */ 
      if (*pend=='\n') *pend=0; 
      printf("Found %s\n",p); /* process/parse the value */ 
     } 
    } 
    return 0; 
} 
+0

спасибо. вот что я искал. – wonderer

-1

С POSIX оболочки, я хотел бы использовать что-то вроде:

answer=`egrep 'wants_config[ ]*=' /etc/myconfig | sed 's/^.*=[ ]*//'` 

Конечно, если вы ищете ответ, который использует библиотеку C STDIO, то вам действительно нужно для рассмотрения документации STDIO.

+0

C, мне нужен код C. Я знаю, как это сделать из командной строки. и нет, я не могу использовать систему() – wonderer

1

Вот быстрый пример использования strtok:

const int linelen = 256; 
char line[linelen]; 

FILE* fp = fopen(argv[1], "r"); 
if (fp == NULL) { 
    perror("Error opening file"); 
} else { 
    while (! feof(fp)) { 
     if (fgets(line, linelen , fp)) { 
      const char* name = strtok(line, "= \r\n"); 
      const char* value = strtok(NULL, "= \r\n"); 
      printf("%s => %s\n", name, value); 
     } 
    } 
    fclose (fp); 
} 

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

+0

'feof()' не работает так, как вы думаете. – pmg

+0

Можете ли вы объяснить немного больше? Из документов «Проверяет, установлен ли индикатор конца файла, связанный с потоком, возвращая значение, отличное от нуля, если оно есть». – jheddings

+0

Он работает в вашем коде, но не проверяет, находится ли файл в конце. Он проверяет, завершилась ли предыдущая попытка чтения из-за окончания файла. Обычно в коде отсутствует 'feof()', который останавливается, когда файл заканчивается. В вашем коде 'if' терпит неудачу, код возвращается к' while', который терпит неудачу, но является избыточным. – pmg

0

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

Если вы запустите его со строкой buffer в качестве первого аргумента, он вернет первый токен из этой строки. Если вы запустите ту же команду с первым аргументом, установленным в NULL, он вернет последующие жетоны из той же исходной строки.

Быстрый пример того, как получить несколько маркеров:

#include <stdio.h> 
#include <string.h> 

int main() { 
    char buffer[17]="wants_return=yes"; 
    char* tok; 
    tok = strtok(buffer, "="); 
    printf("%s\n", tok); /* tok points to "wants_return" */ 
    tok = strtok(NULL, "="); 
    printf("%s\n", tok); /* tok points to "yes" */ 
    return 0; 
} 

Для второго strtok вызова, вы можете заменить "=" с "" вернуть все до конца строки, а не разрывая на следующем знаке равенства.

+1

Строка поступает из 'fgets()': она имеет окончательную новую строку. Если вы делаете второй 'strtok' с' '\ n" ', вы получаете всю оставшуюся строку ** AND ** избавляетесь от новой строки :) – pmg

Смежные вопросы