You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动