C语言读取文件特定关键字后的值并存储的实现方法
解决方案:C语言读取带关键字的文件内容
嘿,这个需求其实挺典型的,我来给你捋捋思路,再给你写个完整的代码片段参考~
首先,我们可以利用fscanf()来逐词读取文件内容,因为你的文件里所有内容都是用空格分隔的,这个函数特别适合。核心思路是:先定位到目标关键字,然后循环读取字符串+数字的配对,直到遇到下一个关键字或者文件结束。
完整代码示例
#include <stdio.h> #include <string.h> // 定义结构体来存储每组键值对(比分开的数组更清晰) typedef struct { char name[50]; // 存储Hello、Namaste这类字符串 int value; // 存储对应的数字 } Item; void readInput() { FILE *fp = fopen("input.txt", "r"); if (!fp) { perror("Failed to open file"); return; } char buffer[50]; // 用来临时存储读取到的单词(关键字或字符串) Item greetings[10]; // 假设最多存10个问候语,可根据需求调整大小 Item flavors[10]; // 存储口味的数组 int greet_count = 0; int flavor_count = 0; // 第一步:找到GREETINGS关键字,读取后续键值对 while (fscanf(fp, "%s", buffer) != EOF) { if (strcmp(buffer, "GREETINGS") == 0) { // 循环读取"字符串+数字"配对 while (fscanf(fp, "%s %d", buffer, &greetings[greet_count].value) != EOF) { // 检查是否遇到下一个关键字FLAVORS if (strcmp(buffer, "FLAVORS") == 0) { // 把FLAVORS放回文件流,留给后续处理 fseek(fp, -strlen(buffer)-1, SEEK_CUR); break; } // 复制字符串到结构体 strcpy(greetings[greet_count].name, buffer); greet_count++; // 防止数组越界 if (greet_count >= 10) break; } break; } } // 第二步:找到FLAVORS关键字,读取后续键值对 while (fscanf(fp, "%s", buffer) != EOF) { if (strcmp(buffer, "FLAVORS") == 0) { while (fscanf(fp, "%s %d", buffer, &flavors[flavor_count].value) != EOF) { strcpy(flavors[flavor_count].name, buffer); flavor_count++; if (flavor_count >= 10) break; } break; } } // 测试输出,验证读取结果 printf("=== 读取到的问候语 ===\n"); for (int i = 0; i < greet_count; i++) { printf("%s: %d\n", greetings[i].name, greetings[i].value); } printf("\n=== 读取到的口味 ===\n"); for (int i = 0; i < flavor_count; i++) { printf("%s: %d\n", flavors[i].name, flavors[i].value); } fclose(fp); } int main() { readInput(); return 0; }
关键细节解释
- 结构体的使用:用
Item结构体封装“字符串+数字”的配对,比单独用两个数组更直观,后续扩展也更方便。 fscanf()的优势:fscanf(fp, "%s %d", ...)可以一次性读取一组字符串和整数,完美匹配你的文件格式。- 关键字判断:用
strcmp()比较读取到的单词是否为目标关键字,注意这个函数区分大小写;如果需要不区分大小写,可以自己实现一个忽略大小写的比较函数。 fseek()的作用:当读取到FLAVORS时,把文件指针往回移,避免把这个关键字当成普通内容处理。- 数组越界保护:循环里加入
if (count >= 10)的判断,防止数组溢出;如果不确定数据量,可以改用malloc/realloc做动态内存分配。
运行结果
用你提供的input.txt内容运行,会输出:
=== 读取到的问候语 === Hello: 13 Namaste: 24 Hola: 36 === 读取到的口味 === Vanilla: 23 Chocolate: 78
内容的提问来源于stack exchange,提问作者c_programming_n00b




