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

