C语言输入txt文件后中文字符出现乱码问题,txt文件使用的是UTF-8的编码格式



```c
#include <stdio.h>
#include<string.h>
#include <stdlib.h> 
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#define LEN sizeof(struct equipment)
#pragma execution_character_set("gbk") 

char path[100] = "E://大学/大二/下/算法报告/real device/equ.txt";
//设备信息结构体 
struct equipment
{
    int num;//编号
    char name[5];//设备名称
    char clas[10];//数量
    char price[8];//价格
    char buy_date[15];//购买日期
    char maintain_date[15];//最近一次维修日期
};
struct equipment equ[50];
//系统操作 
void menu()
{
    printf("\n\n\n");
    printf("\t\t-------------------------------------------------\n");
    printf("\t\t||              ----------------               ||\n");
    printf("\t\t||**************设备信息管理系统***************||\n");
    printf("\t\t||              ----------------               ||\n");
    printf("\t\t||                                             ||\n");
    printf("\t\t||~~~~~~~~~~~~~~~1.录入设备信息~~~~~~~~~~~~~~~~||\n");
    printf("\t\t||~~~~~~~~~~~~~~~2.删除设备信息~~~~~~~~~~~~~~~~||\n");
    printf("\t\t||~~~~~~~~~~~~~~~3.修改设备信息~~~~~~~~~~~~~~~~||\n");
    printf("\t\t||~~~~~~~~~~~~~~~4.查询设备信息~~~~~~~~~~~~~~~~||\n");
    printf("\t\t||~~~~~~~~~~~~~~~5.显示设备信息~~~~~~~~~~~~~~~~||\n");
    printf("\t\t||~~~~~~~~~~~~~~~6.清屏~~~~~~~~~~~~~~~~~~~~~~~~||\n");
    printf("\t\t||                                             ||\n");
    printf("\t\t||*********************************************||\n");
}
//录入设备信息        
void in()
{
    FILE* fp;
    int i, m = 0;
    char ch[3];
    ch[2]=0;
    if ((fp = fopen(path, "r")) == NULL)
    {
        printf("文件打开失败\n");
        return;
    }
    while (!feof(fp))
    {
        if (fscanf(fp, "%d\t%s\t%s\t%s\t%s\t%s\n",
            &equ[m].num, &equ[m].name, &equ[m].clas, &equ[m].price, &equ[m].buy_date, &equ[m].maintain_date) == 6)
            m++;
        else
            break;
    }
    fclose(fp);
    if (m == 0)
    {
        printf("文件没有内容\n");
    }
    if ((fp = fopen(path, "at+")) == NULL)
    {
        printf("文件打开失败\n");
        return;
    }
    printf("  输入设备信息(是/否);\n");
    scanf("%s",&ch);
    while (strcmp(ch, "是") == 0)
    {
        printf("设备编号:\n");
        scanf("%9d",&equ[m].num);
        for (i = 0; i < m; i++)
        {
            if (equ[i].num == equ[m].num)
            {
                printf("该信息已存在\n");
                fclose(fp);
                getchar();
                return;
            }
        }
        printf("  设备名称:\n");
        fflush(stdin);
        scanf("%s",&equ[m].name);
        fflush(stdin);
        printf("  数量:\n");
        fflush(stdin);
        scanf("%s",&equ[m].clas);
        fflush(stdin);
        printf("  价格:\n");
        scanf("%s",&equ[i].price);
        fflush(stdin);
        printf("  购买日期:\n");
        scanf("%s",&equ[m].buy_date);
        fflush(stdin);
        printf("  最近一次维修日期:\n");
        scanf("%s",&equ[m].maintain_date);
        fflush(stdin);
        if (fprintf(fp,"%d\t%s\t%s\t%s\t%s\t%s\t\t\n",
            equ[m].num, &equ[m].name, &equ[m].clas, &equ[m].price, &equ[m].buy_date, &equ[m].maintain_date) == 6)
        {
            printf("信息保存成功\n");
            m++;
        }
        printf("是否继续录入设备信息(是/否):");
        scanf("%s", ch);
    }
    fclose(fp);
}
//删除设备信息 
void delet()
{
    FILE* fp;
    int num, m = 0;
    int i, j;
    int flag = 0;
    char ch[2];
    if ((fp = fopen(path, "rb")) == NULL)
    {
        printf("文件打开失败\n");
        return;
    }
    while (!feof(fp))
    {
        if (fscanf(fp, "%d\t%s\t%s\t%s\t%s\t%s\n",
            &equ[m].num, &equ[m].name, &equ[m].clas, &equ[m].price, &equ[m].buy_date, &equ[m].maintain_date) == 6)
            m++;
        else
            break;
    }
    fclose(fp);
    if (m == 0)
    {
        printf("文件中没有设备信息\n");
    }
    else
    {
        printf("请输入需要删除设备信息的编号:");
        scanf("%d",&num);
    }
    for (i = 0; i < m; i++)
    {
        if (equ[i].num == num)
        {
            printf("该设备已找到,是否删除(是/否):");
            scanf("%s", ch);
            if (strcmp(ch, "是") == 0)
            {
                for (j = i; j < m; j++)
                {
                    equ[j] = equ[j + 1];
                }
                m--;
                flag = 1;
                if ((fp = fopen(path, "wb")) == NULL)
                {
                    printf("文件打开失败\n");
                    return;
                }
                for (j = 0; j < m; j++)
                {
                    if (fwrite(&equ[j], LEN, 1, fp) != 1)
                    {
                        printf("不能保存\n");
                        getchar();
                    }
                }
                fclose(fp);
                printf("删除成功!\n"); break;
            }
            else
            {
                printf("设备信息存在,不需要删除。");
                break;
            }
        }
    }
    if (m == i && flag == 0)
    {
        printf("未找到该设备");
    }
}
//修改设备信息 
void updet()
{
    int num;
    char name[5];
    char clas[10];
    char price[8];
    char buy_date[15];
    char maintain_date[15];
    FILE* fp;
    int m = 0, a;
    int i, j;
    if ((fp = fopen(path, "rb")) == NULL)
    {
        printf("文件打开失败\n");
        return;
    }
    while (!feof(fp))
    {
        if (fscanf(fp, "%d\t%s\t%s\t%s\t%s\t%s\n",
            &equ[m].num, &equ[m].name, &equ[m].clas, &equ[m].price, &equ[m].buy_date, &equ[m].maintain_date) == 6)
            m++;
        else
            break;
    }
    fclose(fp);
    if (m == 0)
    {
        printf("文件中没有设备信息\n");
    }
    else
    {
        printf("请输入需要修改设备信息的编号:");
        scanf("%d",&num);
    }
    for (i = 0; i < m; i++)
    {
        if (num == equ[i].num)
        {
            printf("1:编号,2:设备名称,3:数量,4:价格,5:购买日期,6:最近一次维修日期\n");
            printf("该设备已被找到,请选择需要修改的内容(1-5):");
            scanf("%d",&a);
            while (a)
            {
                switch (a)
                {
                case 1:
                    printf("将%d编号的设备的编号修改为:", num);
                    scanf("%d",&num);
                    equ[i].num = num;
                    for (j = i + 1; j < m; j++)
                    {
                        if (equ[j].num == num)
                        {
                            printf("您修改的编号已存在\n");
                            getchar();
                            return;
                        }
                    }
                    break;
                case 2:
                    printf("将%d编号的设备名称修改为:", num);
                    scanf("%s",&name);
                    strcpy(equ[i].name, name);
                    break;
                case 3:
                    printf("将%d编号的数量修改为:", num);
                    scanf("%s",&clas);
                    strcpy(equ[i].clas, clas);
                    break;
                case 4:
                    printf("将%d编号的设备价格修改为:", num);
                    scanf("%s",&price);
                    strcpy(equ[i].price, price);
                    break;
                case 5:
                    printf("将%d编号的设备购买日期修改为:", num);
                    scanf("%s",&buy_date);
                    strcpy(equ[i].buy_date, buy_date);
                    break;
                case 6:
                    printf("将%d编号的设备最近一次维修日期修改为:", num);
                    scanf("%s",&maintain_date);
                    strcpy(equ[i].maintain_date,maintain_date);
                    break;
                default:
                    printf("选择错误,请重新选择需要修改的内容:");
                    scanf("%d",&a);
                    break;
                }
                printf("请选择需要修改的内容(如果已修改完成请按0):");
                scanf("%d",&a);
            }
            if ((fp = fopen(path, "wb")) == NULL)
            {
                printf("文件打开失败\n");
                return;
            }
            for (j = 0; j < m; j++)
            {
                fprintf(fp,"%d\t%s\t%s\t%s\t%s\t%s\n",
                    equ[j].num, &equ[j].name, &equ[j].clas, &equ[j].price, &equ[j].buy_date, &equ[j].maintain_date);
            }
            fclose(fp);
            printf("修改成功!\n");
            break;
        }
    }
    if (m == i)
    {
        printf("未找到该设备\n");
    }
}
//查询设备信息 
void select()
{
    int num, m = 0;
    int i;
    FILE* fp;
    if ((fp = fopen(path, "rt+")) == NULL)
    {
        printf("文件打开失败\n");
        return;
    }
    while (!feof(fp))
    {
        if (fscanf(fp, "%d\t%s\t%s\t%s\t%s\t%s\n",
            &equ[m].num, &equ[m].name, &equ[m].clas, &equ[m].price, &equ[m].buy_date, &equ[m].maintain_date) == 6)
            m++;
        else
            break;
    }
    fclose(fp);
    if (m == 0)
    {
        printf("文件没有内容\n");
        return;
    }
    printf("请输入设备编号进行查询:");
    scanf("%d",&num);
    for (i = 0; i < m; i++)
    {
        if (num == equ[i].num)
        {
            printf("\n");
            printf("该设备信息已被查到;\n");
            printf("设备编号\t设备名称\t数量\t价格\t购买日期\t最近一次维修日期\t\n");
            printf("%7d\t%s\t\t%s\t%s\t%s\t%s\t\n",equ[i].num, &equ[i].name, &equ[i].clas, &equ[i].price, &equ[i].buy_date, &equ[i].maintain_date);
            break;
        }
    }
    if (m == i)
    {
        printf("该设备信息不存在\n");
        return;
    }
}
//显示设备信息 
void print()
{
    int i, m = 0;
    FILE* fp;
    if ((fp = fopen(path, "rt")) == NULL)
    {
        printf("文件打开失败\n");
        return;
    }
    while (!feof(fp))
    {
        if (fscanf(fp, "%d\t%s\t%s\t%s\t%s\t%s\n",
            &equ[m].num, &equ[m].name, &equ[m].clas, &equ[m].price, &equ[m].buy_date, &equ[m].maintain_date) == 6)
            m++;                         //得出行数
        else
            break;
    }
    fclose(fp);
    if (m == 0)
    {
        printf("文件中没有内容\n");
    }
    else
    {
        printf("设备编号\t设备名称\t数量\t价格\t购买日期\t最近一次维修日期\n");
        for (i = 0; i < m; i++)
        {
            printf("%7d\t\t%s\t\t%s\t%s\t%s\t%s\t\n", equ[i].num, &equ[i].name, &equ[i].clas, &equ[i].price, &equ[i].buy_date, &equ[i].maintain_date);
        }
    }
}
//清屏
void clea()
{
    system("cls");
}
int main()
{
    menu();
    int n;
    printf("请选择功能(1-6):\n");
    scanf("%d",&n);
    while (n)
    {
        if (n >= 1 && n <= 9)
        {
            switch (n)
            {
            case 1:in(); break;
            case 2:delet(); break;
            case 3:updet(); break;
            case 4:select(); break;
            case 5:print(); break;
            case 6:clea(); break;
            }
            if (n == 6)
            {
                menu();
            }
            printf("\n");
            printf("请选择功能(1-6):");
            scanf("%d",&n);
        }
        else
        {
            printf("\n");
            printf("请重新输入:");
            scanf("%d",&n);
        }
    }
    return 0;
}



输入设备信息后会出现乱码问题,

img

fprintf() fscanf() printf() 函数的使用有问题,修改如下,供参考:


 if (fscanf(fp, "%d\t%s\t%s\t%s\t%s\t%s\n",
            &equ[m].num, equ[m].name, equ[m].clas, equ[m].price, equ[m].buy_date, equ[m].maintain_date) == 6)  //修改
            //&equ[m].num, &equ[m].name, &equ[m].clas, &equ[m].price, &equ[m].buy_date, &equ[m].maintain_date) == 6)


 if (fprintf(fp,"%d\t%s\t%s\t%s\t%s\t%s\t\t\n",
            equ[m].num, equ[m].name, equ[m].clas, equ[m].price, equ[m].buy_date, equ[m].maintain_date) == 6)  //修改
            //equ[m].num, &equ[m].name, &equ[m].clas, &equ[m].price, &equ[m].buy_date, &equ[m].maintain_date) == 6)

 printf("%7d\t\t%s\t\t%s\t%s\t%s\t%s\t\n", equ[i].num, equ[i].name, equ[i].clas, equ[i].price, equ[i].buy_date, equ[i].maintain_date); //修改
 // printf("%7d\t\t%s\t\t%s\t%s\t%s\t%s\t\n", equ[i].num, &equ[i].name, &equ[i].clas, &equ[i].price, &equ[i].buy_date, &equ[i].maintain_date);

所有的 char 替换成 wchar 看看(仅限 VC++)