我正在尝试从文本文件中提取键,值,但是在确定如何定位值的结尾时遇到了麻烦。这是文本文件的一小段。
GIRRAFE: A tall spotted animal
LION: A short carnivore.
Prince: The son of a king.
Princess: The daughter of a king.
这是我的代码:
FILE *fp;
char line[20], word[20];
int i = 0, endind;
fp = fopen(file, "r");
if (fp==NULL){
printf("Error parsing the file\n");
exit(1);
}
while (!feof(fp)){
fgets(line, 100, fp);
for (i;i<strlen(line);i++){
if (line[i]=='.'){
endind = i;
}
}
for (i;i<endind;i++){
word[i] = line[i];
printf("%s\n",word);
}
}
该代码不是很好,因为Im无法获得以完整的空白换行符结尾的值。
最佳答案
从示例数据来看,键似乎在第一个'.'
处结束
在字符串中。使用strchr(3)进行查找。但是看起来
该值以及整个项目以两个换行符结尾。对于
您将需要编写代码才能将段落读入字符串。
为此,malloc(3)和realloc(3)将很有用。如果你有
一个已知的最大大小,您当然可以使用固定大小的缓冲区。
将问题分成几部分。首先,阅读一段,然后找到
键在哪里结束,然后找到值的开始位置。决定是否
两个换行符是值的一部分,以及句点是否是一部分
的关键。
要阅读段落,请一行阅读。如果该行为空(您可以使用strcmp(line, "\n")
确定),那么就可以读取该值,
您可以继续前进。否则,将该行追加到段落缓冲区。
在将整个段落作为单个字符串获取后,找到char *keyend = strchr(para, '.')
键,它将返回一个指向'.'
字符的指针。您可以将该字符替换为空(*keyend = 0
)
现在para是带有键的字符串。接下来前进关键端指针
到第一个非空白字符。有几种方法可以做到这一点。此时,keyend现在将指向该值。哪一个
给您para作为指向键的指针,而keyend作为指向键的指针
值。这样,您就可以更新哈希表。
我也将一路检查错误,并可能使用单独的
为段落,键和值更好地命名的变量。修整
尾随换行符和其他数据验证是可选的。例如,如果一个段落根本不包含'.'
字符怎么办?