我正在尝试从文本文件中提取键,值,但是在确定如何定位值的结尾时遇到了麻烦。这是文本文件的一小段。

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作为指向键的指针
值。这样,您就可以更新哈希表。

我也将一路检查错误,并可能使用单独的
为段落,键和值更好地命名的变量。修整
尾随换行符和其他数据验证是可选的。例如,如果一个段落根本不包含'.'字符怎么办?

07-27 14:00