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

C语言中如何将文件每行内容存入数组?(CLI待办事项程序数据加载问题)

C语言中如何将文件每行内容存入数组?(CLI待办事项程序数据加载问题)

嘿,欢迎来Stack Overflow!第一次提问完全不用不好意思,你已经把问题描述得很清楚啦,咱们直接来解决这个加载数据的问题~

首先看你写的load_data函数,最明显的问题就是strcpy(todo_list[], task);这行的语法错误——数组下标不能空着,得指定具体的索引位置。刚好你有task_counter这个变量,初始是0,完全可以用它来做数组的索引,每次循环后再自增,完美对应数组的每一个位置。

除此之外,还有几个小细节需要调整,不然可能会有隐藏问题:

  1. 处理fgets读取的换行符fgets会把每行末尾的换行符\n也一起读进字符串里,要是直接存进数组,后续显示任务的时候可能会多出来一个空行,或者影响字符串比较之类的操作,最好把这个换行符去掉。
  2. 判断文件是否成功打开:如果data.txt不存在(比如第一次运行程序还没保存过任务),fopen会返回NULL,这时候直接用的话程序会崩溃,得加个判断处理这种情况。
  3. 防止数组越界:你的MAX_TASKS是100,所以加载的时候要检查task_counter有没有超过这个上限,不然会写出数组范围,导致程序出问题。
  4. 原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就把代码贴得这么完整,已经做得很好啦,不用抱歉😉

你可以试试把这段代码替换进去,应该就能正常加载之前保存的任务了!

火山引擎 最新活动