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

fprintf打开文件但无法写入问题求助(附代码)

问题分析与解决:无法向文件写入链表内容

嘿,我一眼就揪出了你代码里的关键问题——你在遍历链表的循环里,一直只写链表头节点的数据,完全没用到当前遍历的curr节点!这就是为什么文件写入异常的原因,而用printf的时候你应该是直接输出了正确的节点数据,所以看起来正常。

核心错误点

看你save_file函数里的循环部分,所有的fprintf都在访问list->header->c,但你的curr明明在一步步往后遍历:

while(curr != NULL){
    fprintf(file, "%d;", list->header->c->prioridade);
    fprintf(file, "%d;", list->header->c->id);
    // 所有写入操作都用了头节点,而不是当前的curr节点
    curr= curr->next;
}

这会导致两种情况:如果链表只有一个节点,可能还能看到内容;如果有多个节点,就会重复写入头节点的数据,甚至如果链表结构有问题,还可能出现写入混乱或者没内容的情况。

修复后的代码

把所有list->header->c替换成curr->c,同时我还加了两个重要的优化:

void save_file(list_cards *list){
    FILE *file;
    // 增加文件打开失败的检查,避免空指针操作
    file = fopen("D:\\Users\\Diogo\\Desktop\\projectkanban\\kanbanv2\\cartoes.txt", "w");
    if(file == NULL){
        perror("Failed to open file"); // 打印具体错误,方便排查
        return;
    }
    node_card *curr = list->header;
    while(curr != NULL){
        fprintf(file, "%d;", curr->c->prioridade);
        fprintf(file, "%d;", curr->c->id);
        // time_t是长整型,强制转成long long用%lld输出,避免格式不匹配
        fprintf(file, "%lld;", (long long)curr->c->data_criacao);
        fprintf(file, "%s;", curr->c->descricao);
        fprintf(file, "%d;", curr->c->estado);
        fprintf(file, "%d;", curr->c->p->id);
        fprintf(file, "%lld;", (long long)curr->c->prazo_conclusao);
        fprintf(file, "%lld\n", (long long)curr->c->data_conclusao);
        curr= curr->next;
    }
    fclose(file);
}

额外注意事项

  • time_t的格式匹配:time_t在大多数系统里是长整型,用%d输出会导致格式不匹配,可能出现乱码或者数据错误,所以转换成long long后用%lld是更安全的做法。
  • 文件打开错误检查:虽然你说能打开文件,但加上这个判断后,如果后续出现权限问题、路径错误等情况,能直接看到错误原因,不用瞎猜。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:17:17