C语言中如何将文件每行内容存入数组?(CLI待办事项程序数据加载问题)
C语言中如何将文件每行内容存入数组?(CLI待办事项程序数据加载问题)
嘿,欢迎来Stack Overflow!第一次提问完全不用不好意思,你已经把问题描述得很清楚啦,咱们直接来解决这个加载数据的问题~
首先看你写的load_data函数,最明显的问题就是strcpy(todo_list[], task);这行的语法错误——数组下标不能空着,得指定具体的索引位置。刚好你有task_counter这个变量,初始是0,完全可以用它来做数组的索引,每次循环后再自增,完美对应数组的每一个位置。
除此之外,还有几个小细节需要调整,不然可能会有隐藏问题:
- 处理fgets读取的换行符:
fgets会把每行末尾的换行符\n也一起读进字符串里,要是直接存进数组,后续显示任务的时候可能会多出来一个空行,或者影响字符串比较之类的操作,最好把这个换行符去掉。 - 判断文件是否成功打开:如果
data.txt不存在(比如第一次运行程序还没保存过任务),fopen会返回NULL,这时候直接用的话程序会崩溃,得加个判断处理这种情况。 - 防止数组越界:你的
MAX_TASKS是100,所以加载的时候要检查task_counter有没有超过这个上限,不然会写出数组范围,导致程序出问题。 - 原save函数的小坑:你的
save_data用的是"a"追加模式,每次保存都会把所有任务再追加到文件末尾,这样下次加载的时候就会读到重复的任务!应该改成"w"覆盖模式,每次保存都重新写入所有任务,避免重复。
下面是修正后的完整代码,我把每个修改点都标了注释:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "task_process.h" #define MAX_TASKS 100 #define MAX_CHARS 500 char todo_list[MAX_TASKS][MAX_CHARS]; int task_counter = 0; void save_data() { // 改用"w"覆盖模式,避免每次保存都追加重复内容 FILE *data_file = fopen("data.txt", "w"); if (!data_file) { // 新增:判断文件是否成功打开 printf("无法打开文件进行保存!\n"); return; } for (int i = 0; i < task_counter; i++) { fprintf(data_file, "%s\n", todo_list[i]); } fclose(data_file); } void load_data() { FILE *data_file = fopen("data.txt", "r"); if (!data_file) { // 新增:文件不存在时直接返回,避免崩溃 printf("未找到已保存的任务文件,将创建新任务\n"); return; } char task[MAX_CHARS]; // 新增:加task_counter < MAX_TASKS判断,防止数组越界 while (fgets(task, MAX_CHARS, data_file) && task_counter < MAX_TASKS) { // 新增:去掉fgets读取到的换行符 size_t len = strlen(task); if (len > 0 && task[len-1] == '\n') { task[len-1] = '\0'; } // 修正:用task_counter作为数组下标,复制后再自增 strcpy(todo_list[task_counter], task); task_counter++; } fclose(data_file); }
最后再给你几个小提示:
- 以后写文件操作的时候,养成先判断
fopen返回值的习惯,能避免很多莫名其妙的崩溃 - 要是以后想支持更多任务,可以把
MAX_TASKS调大,或者改用动态内存分配(比如malloc),不过你现在这个小项目用固定数组完全足够 - 第一次用Stack Overflow就把代码贴得这么完整,已经做得很好啦,不用抱歉😉
你可以试试把这段代码替换进去,应该就能正常加载之前保存的任务了!




