簡體   English   中英

在文本文件中搜索字符串並解析該行(Linux,C)

[英]Search for a string in a text file and parse that line (Linux, C)

這是“如何解析配置文件”的問題。 基本上我有一個具有所有設置的文本文件(/ etc / myconfig)。 我需要閱讀該文件並搜索字符串:

wants_return=yes

一旦找到該字符串,我就需要解析它並僅返回等號后的任何內容。 我嘗試使用fgets和strtok的組合,但是在這里我感到困惑。 無論如何,有人知道可以執行此操作的功能嗎?

代碼受到贊賞。

謝謝

這有效:(注意:我不確定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;
}

這是一個使用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);
}

請注意,您需要對它進行一些附加的錯誤檢查,但這可以解析我扔給它的文件。

從您的評論看來,您已經在使用fgets從文本文件中獲取適當的行並將其加載到字符緩沖區中。 您可以使用strtok從行中解析標記。

如果使用字符串緩沖區作為第一個參數運行它,它將返回該字符串的第一個標記。 如果在第一個參數設置為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調用,可以將"="替換為"=" ""以將所有內容返回到字符串的末尾,而不必在下一個等號處中斷。

對於POSIX shell,我將使用類似以下內容的東西:

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

當然,如果您正在尋找使用C STDIO庫的答案,那么您確實需要查看STDIO文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM