C语言写入疫苗数据到txt文件出现乱码无法保存,该如何解决?
问题原因
你代码出现乱码和无效值是由以下几个明确的错误导致的:
- 数组下标越界访问:你定义的for循环为
for (i = 0; i < 2; i++),循环执行结束后i的最终值为2,此时你直接用vacc[i]写入文件,访问的是未初始化的数组第三个元素,存储的是栈内存的随机垃圾值,写入后就会显示为乱码。 - 写入逻辑遗漏循环:你循环录入了2条疫苗数据,但写入文件时没有遍历已录入的内容,仅尝试写入了1条越界的无效数据。
- 不安全函数风险:代码中使用的
gets()是C标准已经明确废除的函数,存在缓冲区溢出漏洞,容易导致程序崩溃。
修正后的完整代码
#include <stdio.h> #include <string.h> // 可根据你实际的字段定义调整结构体参数 struct Vaccine { char vaccine[100]; char code[20]; char produce[100]; int dosage_taken; float population_size; float quantity; }; void addvac() { int i; struct Vaccine vacc[6]; printf("\n---------------------------------------------------------------------"); printf("\n\t\t\t Add Vaccine "); printf("\n---------------------------------------------------------------------\n"); getchar(); for (i = 0; i < 2; i++) { printf("Enter Name: "); // 替换gets为安全的fgets,避免缓冲区溢出 fgets(vacc[i].vaccine, sizeof(vacc[i].vaccine), stdin); // 去掉fgets读取到的末尾换行符 vacc[i].vaccine[strcspn(vacc[i].vaccine, "\n")] = '\0'; printf("Enter Code: "); scanf("%s", vacc[i].code); printf("Enter Produce by : "); scanf("%s", vacc[i].produce); printf("Enter Dosage : "); scanf("%d", &vacc[i].dosage_taken); printf("Enter Population Covered : "); scanf("%f", &vacc[i].population_size); printf("Enter Quantity : "); scanf("%f", &vacc[i].quantity); getchar(); printf("\n\n"); } FILE* fptr; // 如果需要每次追加数据不覆盖原有内容,把"w"改成"a"即可 fptr = fopen("Vaccine.txt", "w"); // 新增循环,写入所有已录入的2条有效数据 for (i = 0; i < 2; i++) { fprintf(fptr, "%s\t", vacc[i].vaccine); fprintf(fptr, "%s\t", vacc[i].code); fprintf(fptr, "%s\t", vacc[i].produce); fprintf(fptr, "%d\t", vacc[i].dosage_taken); fprintf(fptr, "%.4f\t", vacc[i].population_size); fprintf(fptr, "%f\n", vacc[i].quantity); // 末尾加换行区分不同疫苗记录 } fclose(fptr); }
修改说明
- 补全了通用的
struct Vaccine结构体定义,你可以根据实际业务调整字段的数组长度。 - 把废弃的
gets()替换为安全的fgets(),并处理了读取后的换行符问题,避免名称字段多带一个换行符。 - 新增写入循环,遍历已经录入的0~1下标的2条有效数据写入文件,避免越界访问垃圾值。
- 每条记录末尾增加换行符,打开文件时不同疫苗的记录会分行显示,可读性更好。
- 如果需要保留之前的记录、每次新增都追加写入,把打开文件的模式
"w"改成"a"即可。
内容的提问来源于stack exchange,提问作者Zidane Leong
相关产品推荐
相关产品推荐

