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
相关产品推荐
相关产品推荐

