You need to enable JavaScript to run this app. C语言写入疫苗数据到txt文件出现乱码无法保存,该如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 18:06:07