用c将数据写入文件,可以写入,但打开文件是数据出现乱码,什么原因???

#include
#include
struct Student
{
char name[10];
int num;
int age;
char addr[15];
}stud[2];
void Save()
{
FILE *fp;
int i;
if((fp=fopen("stu.txt","wb"))==NULL)
{
printf("cann't open file");
return;
}
for(i=0;i<2;i++)
if(fwrite(&stud[i],sizeof(struct Student),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
int main()
{
int i;
printf("Please enter data of student:\n");
for(i=0;i<2;i++)
scanf("%s%d%d%s",&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);
Save();
return 0;
}

图片说明

说编码问题的都不是写C语言的,你写入结构体的时候,要把结构体数据成员,全部转成字符串写入文件,这样写入的文件才是给人看的,你那样写入是给机器看的

fwrite对int型的打印默认是以ASCII打印的,你这个不叫乱码,而是你写的数字对应的ASCII,建议把fwrite这一句改成fprintf(fp, "%s %d %d %s", stud[i].name, stud[i].num, stud[i].age, stud[i].addr)

写入的是数字吧,文本方式打开,要能看见得是字符啊,如写入0时需要给0+‘0’再写入文件才行,你用16进制软件打开你的文件应该就能看见你保存的数字了。

这个问题和我的差不多,我已经解决了,你可以访问我的博客,地址献上https://blog.csdn.net/Z1272633296/article/details/106947174

编码的问题,你在save函数中写入student中的各项值时,要注意string类型的编码。由于没用过C(我用C#时也出现过这种问题),只能给你点思路了。

看格式 保存进文件的时候

编码问题,一般是utf-8的。

结构体不能用文本文件存、你试试用二进制文件存储、再打开看看。

if((fp=fopen("stu.txt","wb"))==NULL)
模式问题,wb是表示二进制写入,所以是乱码,但并不会影响读到的信息。


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct Student
{
    char name[10];
    int num;
    int age;
    char addr[15];
} Student;

int load(const char *filepath, Student *students, int num, bool text)
{
    if (!students || num <= 0)
    {
        return -1;
    }
    FILE *fp;
    int i;
    if(filepath)
    {
        if ((fp = fopen(filepath, "r")) == NULL)
        {
            fprintf(stderr, "Failed to open file %s\n", filepath);
            return -2;
        }
    }
    else
    {
        fp = stdin;
    }

    if (text)
    {
        for(i = 0; i < num; i++)
        {
            fscanf(fp, "%s %d %d %s", students[i].name, &students[i].num, &students[i].age, students[i].addr);
            getc(fp);
        }
    }
    else
    {
        fread(students, sizeof(Student), num, fp);
    }
    if (filepath)
        fclose(fp);
    return 0;

}

int save(const char *filepath, Student *students, int num, bool text)
{
    if (!students || num <= 0)
        return -1;
    FILE *fp;
    int i;
    if(filepath)
    {
        if ((fp = fopen(filepath, "w")) == NULL)
        {
            fprintf(stderr, "Failed to open file %s\n", filepath);
            return -2;
        }
    }
    else
    {
        fp = stdout;
    }

    if (text)
    {
        for(i = 0; i < num; i++)
        {
            fprintf(fp, "%s %d %d %s\n", students[i].name, students[i].num, students[i].age, students[i].addr);
        }
    }
    else
    {
        fwrite(students, sizeof(Student), num, fp);
    }
    if (filepath)
        fclose(fp);
    return 0;
}

void show(Student *students, int num)
{
    int i;
    printf("Students\n");
    printf("Name\tNum\tAge\tAddr\n");
    for (i = 0; i < num; i++)
    {
        printf("%s\t%d\t%d\t%s\n", students[i].name, students[i].num, students[i].age, students[i].addr);
    }
}

int main()
{
    int op = 1;
    char filepath[64];
    Student *students = NULL;
    int num = 0;
    int i;
    bool text;
    printf("Select your mode:\n");
    printf("1. text [default]\t2. binary\n");
    scanf("%d", &op);
    switch(op)
    {
        case 1:
            text = true;
            break;
        case 2:
            text = false;
            break;
        default:
            text = true;
            break;
    }
    while (op > 0 && op < 5)
    {
        printf("Select your option:\n");
        printf("1. Load from file\n");
        printf("2. Save to file\n");
        printf("3. Show data\n");
        printf("4. Create data\n");
        printf("5. Exit\n");
        scanf("%d", &op);
        getchar();

        switch(op)
        {
            case 1: 
                printf("File path: ");
                scanf("%s", filepath);
                getchar();
                printf("Students' num: ");
                scanf("%d", &num);
                getchar();
                if (students)
                    free(students);
                students = malloc(sizeof(Student) * num);
                if (!load(filepath, students, num, text))
                {
                    printf("Success\n");
                }
                else
                {
                    printf("Fail\n");
                }
                break;
            case 2:
                printf("File path: ");
                scanf("%s", filepath);
                getchar();
                printf("Students' num: ");
                scanf("%d", &num);
                getchar();
                if (!save(filepath, students, num, text))
                {
                    printf("SUccess\n");
                }
                else
                {
                    printf("Fail\n");
                }

                break;
            case 3:
                show(students, num);
                break;
            case 4:
                printf("Students' num: ");
                scanf("%d", &num);
                getchar();
                if (students)
                    free(students);
                students = malloc(sizeof(Student) * num);
                load(NULL, students, num, true);
                break;
            default:
                break;
        }
    }
    return 0;
}

此代码段可以从文件导入数据,也可以保存到文件. 数据格式支持文本模式text, 也支持二进制模式binary.
需要注意的是字符串数据(name, addr)内部必须是连续的,不能包含空格, 否则导入数据可能解析出错.

好像你不能用记事本打开。

下载个文本编辑器 即可

你这个采用的是文件输入二进制格式输入,打开文件当然会是乱码,
if((fp=fopen("stu.txt","wb"))==NULL)
改成
if((fp=fopen("stu.txt","w"))==NULL)

for(i=0;i<2;i++)
if(fwrite(&stud[i],sizeof(struct Student),1,fp)!=1)
改成
for(i=0;i<2;i++) {
fprintf(fp , "%s %d %d %s\n" , stud[i].name , stud[i].num, stud[i].age, stud[i].addr) ;
}

#include "stdio.h"

struct Student
{
char name[10];
int num;
int age;
char addr[15];
}stud[2];

void Save()
{
FILE *fp;
int i;

if((fp=fopen("c:\\stu.txt","wb"))==NULL)
{
    printf("cann't open file");
    return;
}

for(i=0;i<2;i++)
    if(fwrite(&stud[i],sizeof(struct Student),1,fp)!=1)
        printf("file write error\n");

fclose(fp);

}

int main()
{
int i;
printf("Please enter data of student:\n");
for(i=0;i<2;i++)
scanf("%s%s%s%s",&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);//这样就可以了,你试试
Save();
return 0;
}

编码的问题, 在文本文档右键另存为,然后将编码改为unicode格式保存,再打开就好了