You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言读取含S前缀的文件内容并存储到数组指定位置

C语言读取特定格式文件并存储到对应数组下标

没问题,这个需求其实用C语言的标准文件操作就能轻松搞定,我给你拆解成清晰的步骤,再附上完整代码,保证你能快速上手。

核心思路

  • 利用fscanf的格式匹配特性,直接跳过前缀S,提取每组数据的下标和数值,不用手动处理字符串,这是最高效的方式。
  • 准备一个数组存储数值:如果能提前确定最大下标,用静态数组即可;如果不确定,先扫描文件找到最大下标,再动态分配数组(更灵活)。
  • 循环读取每一组数据,将数值存入对应下标的数组位置,同时做好异常处理(比如文件打不开、下标越界)。

基础实现(静态数组)

如果已经知道文件里的下标不会超过某个值(比如示例里的最大下标是74,我们设成100足够用),可以用静态数组实现:

#include <stdio.h>
#include <stdlib.h>

#define MAX_INDEX 100  // 根据实际情况调整最大下标

int main() {
    // 初始化数组,所有元素默认设为0(可根据需求修改默认值)
    int arr[MAX_INDEX] = {0};
    FILE *fp = fopen("data.txt", "r");  // 替换成你的实际文件名

    // 检查文件是否成功打开
    if (fp == NULL) {
        perror("无法打开文件");  // 输出具体错误原因,方便调试
        return 1;
    }

    int index, value;
    // 关键:用fscanf匹配格式,自动跳过前缀'S'
    while (fscanf(fp, "S%d %d", &index, &value) == 2) {
        // 必须检查下标是否在数组范围内,避免内存越界崩溃
        if (index >= 0 && index < MAX_INDEX) {
            arr[index] = value;
        } else {
            printf("警告:下标%d超出数组范围,已跳过该组数据\n", index);
        }
    }

    fclose(fp);  // 记得关闭文件

    // 验证存储结果(可选)
    printf("数组存储结果:\n");
    for (int i = 0; i < MAX_INDEX; i++) {
        if (arr[i] != 0) {  // 只打印有赋值的位置
            printf("arr[%d] = %d\n", i, arr[i]);
        }
    }

    return 0;
}

进阶优化(动态数组)

如果不确定文件里的最大下标,或者下标范围很大,静态数组会浪费内存或者不够用,这时候可以先扫描文件找到最大下标,再动态分配数组:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp = fopen("data.txt", "r");
    if (fp == NULL) {
        perror("无法打开文件");
        return 1;
    }

    // 第一步:扫描文件,找到最大的下标值
    int max_index = -1;
    int index, value;
    while (fscanf(fp, "S%d %d", &index, &value) == 2) {
        if (index > max_index) {
            max_index = index;
        }
    }

    // 检查文件是否有有效数据
    if (max_index == -1) {
        printf("文件中没有有效数据\n");
        fclose(fp);
        return 1;
    }

    // 动态分配数组,大小为max_index + 1(下标从0开始)
    int *arr = (int *)malloc((max_index + 1) * sizeof(int));
    if (arr == NULL) {
        perror("内存分配失败");
        fclose(fp);
        return 1;
    }

    // 初始化数组元素为0
    for (int i = 0; i <= max_index; i++) {
        arr[i] = 0;
    }

    // 第二步:将文件指针移回开头,重新读取数据存入数组
    rewind(fp);
    while (fscanf(fp, "S%d %d", &index, &value) == 2) {
        arr[index] = value;
    }

    fclose(fp);

    // 验证结果
    printf("数组存储结果:\n");
    for (int i = 0; i <= max_index; i++) {
        if (arr[i] != 0) {
            printf("arr[%d] = %d\n", i, arr[i]);
        }
    }

    free(arr);  // 记得释放动态分配的内存,避免内存泄漏
    return 0;
}

关键细节说明

  • fscanf格式匹配:"S%d %d"这个格式字符串是核心,它会自动匹配文件中的S前缀,然后读取后面的整数下标和数值,完全不用手动处理字符串截取,简洁又高效。
  • 越界检查:无论用静态还是动态数组,都要检查下标是否合法,否则会导致内存访问错误,程序崩溃。
  • 资源释放:动态分配的内存一定要用free释放,打开的文件一定要用fclose关闭,避免内存泄漏和资源浪费。

内容的提问来源于stack exchange,提问作者c_programming_n00b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:50:29