Найдите строку в текстовом файле и проанализируйте эту строку (Linux, C) - PullRequest
0 голосов
/ 10 ноября 2009

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

wants_return=yes

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

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

спасибо

Ответы [ 4 ]

2 голосов
/ 10 ноября 2009

Это работает: (примечание: я не уверен, должен ли 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;
}
1 голос
/ 10 ноября 2009

Вот краткий пример использования 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 голосов
/ 10 ноября 2009

Из вашего комментария похоже, что вы уже получаете соответствующую строку из текстового файла, используя 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 вы можете заменить "=" на "", чтобы вернуть все в конец строки вместо прерывания при следующем знаке равенства.

0 голосов
/ 10 ноября 2009

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

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

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

...