结构体写入文本文件函数调用后程序异常终止问题求助
问题排查与修复方案
嘿,我帮你找出程序调用函数后直接终止的原因了——核心是一个容易踩的文件处理坑,还有几个小的格式错误,我一步步给你拆解:
1. 导致崩溃的直接原因:空指针调用fclose
你把fclose(pok)写在了else代码块的外面!这意味着如果fopen失败(比如文件权限问题、路径错误),pok会是NULL,这时候程序依然会执行fclose(NULL),这属于未定义行为,系统会直接终止程序。
2. 输入输出的格式错误
- 字符串输入问题:
scanf("%s", &artikl.ime)——如果artikl.ime是char数组(比如char ime[50];),完全不需要加&,因为数组名本身就是指向首元素的指针,写成scanf("%s", artikl.ime)就对了;要是ime是单个char,那这个输入逻辑本身就错了,%s是用来读取字符串的。 - 输出格式错误:
fprintf里你用了%c来输出artikl.ime,但%c是输出单个字符的,要输出字符串得用%s,不然不仅输出结果不对,还可能触发内存访问错误。另外你的格式字符串里有多余的逗号(比如\n,),会导致输出文本格式混乱。
3. 修复后的完整代码
我把所有问题都修正了,还给你补了结构体的定义(假设你之前是这么定义的):
#include <stdio.h> // 先定义结构体,可按需调整数组长度 typedef struct { char ime[50]; float cijena; int ID; } ARTIKL; void unos_aritkala(void) { FILE* pok = NULL; pok = fopen("artikli.txt", "a+"); if (pok == NULL) { printf("Datoteka se ne moze otvoriti\n"); return; // 打开失败直接返回,避免执行后续逻辑 } ARTIKL artikl; printf("Unesite ime artikla: "); scanf("%s", artikl.ime); // 去掉多余的& printf("Unesite cijenu artikla: "); scanf("%f", &artikl.cijena); printf("Unesite ID artikla: "); scanf("%d", &artikl.ID); // 修正格式字符串,用%s输出字符串,调整排版 fprintf(pok, "Ime: %s\nCijena: %.2f\nID: %d\n\n", artikl.ime, artikl.cijena, artikl.ID); fclose(pok); // 只有文件打开成功才执行关闭操作 } // 主函数示例 int main() { unos_aritkala(); return 0; }
额外小建议
- 如果需要支持带空格的商品名称,别用
scanf("%s"),改用fgets(artikl.ime, sizeof(artikl.ime), stdin),记得手动处理掉输入末尾的换行符。 - 每次调用
scanf后可以检查返回值,比如if (scanf("%f", &artikl.cijena) != 1),这样能避免用户输入非法内容导致程序异常。
内容的提问来源于stack exchange,提问作者J. Markovic
相关产品推荐
相关产品推荐

