我见过各种控制台应用程序的“配置”文件(是的,文本文件),如下所示
<token> <value>
我如何在C中解析这样的事情,其中&lt;值&gt;可能是一个字符串,一个字母,甚至整数/浮点/双?
我读到了这个问题“How do I parse a token from a string in C?”,其中大多数建议使用strtok,但它也不是线程安全的,我计划生成多个线程(假设我能够完成我的应用程序)
P.S 以下是令牌和值
的示例user username123
pass 123456
啊,我忘记了棘手的部分。我还必须能够解析一个令牌,该令牌有多个值,用逗号分隔。
答案 0 :(得分:3)
我认为fgets()
和sscanf()
是你的朋友:
int parseTokens(FILE *filePtr, char **tokens, char **values)
{
int i = 0;
char line[128];
while (fgets(line, 127, filePtr)) {
tokens[i] = malloc(64);
values[i] = malloc(64);
sscanf(line, "%s %s", tokens[i], values[i]);
i++;
}
return i;
}
int main(void)
{
char *tokens[20];
char *values[20];
FILE *filePtr = fopen("~/test.txt", "r");
if (!filePtr)
{
fprintf(stderr, "Error opening file: %s", strerror(errno));
}
int count = parseTokens(filePtr, tokens, values);
for (int i = 0; i < count; i++) {
printf("%s %s\n", tokens[i], values[i]);
free(tokens[i]);
free(values[i]);
}
fclose(filePtr);
}
答案 1 :(得分:2)
使用getc()
,将输入流中的字符读入每行缓冲区。点击令牌分隔符后,您将每行缓冲区strncpy()
or strdup()
转换为令牌char*
。如果需要,再次在令牌内分隔符(例如逗号)上解析令牌,一次抓取一个字符并将其存储在每个令牌缓冲区中,直到您点击一个令牌内分隔符。点击行分隔符后,将每行缓冲区复制为值char*
。如果您知道该值为int
,float
等,请使用C函数将char*
转换为这些基元(例如strtol()
等)。如果您有多个令牌 - 值对,请保留一个或一组指向令牌和值char*
变量的指针。重复直到EOF(文件结束)。
答案 2 :(得分:1)
试试这个:
FILE* fp;
fp = fopen("in.txt","r");
if(fp == NULL)
{
printf("Can't open/read file.\n");
exit(1);
}
char* buf = NULL;
char* key = malloc(64);
char* val = malloc(64);
size_t read;
size_t len = 0;
if(key == NULL || val == NULL)
{
printf("malloc failed.\n");
exit(1);
}
while((read = getline(&buf, &len, fp)) != -1)
{
sscanf(buf,"%s %s", key, val);
printf("<%s> <%s>\n", key, val);
}
if(buf != NULL)
{
free(buf);
}
free(key);
free(val);
fclose(fp);
in.txt 文件:
key value
key1 value1
C应用输出:
<key> <value>
<key1> <value1>
我希望这对你有所帮助。
答案 3 :(得分:0)
如何使用regexp
?如果你在Linux中,你可以#include <regexp.h>
使用它。并man regexp.h
将获得如何使用它。用字符串存储它们。并且,它们是数字,使用sprintf
将它们转换为unmber。