[英]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.