fwrite写入乱码(c语言 用fwrite写入txt的文件,为什么是一堆乱码呢 ,下面是我的程序)

本文目录
- c语言 用fwrite写入txt的文件,为什么是一堆乱码呢 ,下面是我的程序
- C 语言,文件操作将结构体数组用fwrite写入文件后,打开时为什么文件中会是一堆乱码
- fwrite保存数据,文本打开变乱码
- 为什么结构体里面的int型变量用fwrite写入文件时显示乱码
c语言 用fwrite写入txt的文件,为什么是一堆乱码呢 ,下面是我的程序
这个函数以二进制形式对文件进行操作
按数据定义结构的写入保持数据结构的长度,对于数值类型,再用文本方式打开时表现为
乱码。例如float
a=12345.67,写入文件后为4个字节,打开后不是文本表示的8个字节。
C 语言,文件操作将结构体数组用fwrite写入文件后,打开时为什么文件中会是一堆乱码
注意你的写入语句:
fwrite(&s[i],sizeof(stu),1,fp);你这样是以二进制的形式将stu结构写入文件的。
typedef struct{
char name;
int score[M];
double avg;
}stu;
应该用fprintf函数分三次完成一个记录的输出:
fprintf(fp,“%s\t“, s[i].name);int j; //在前面补充定义
for(j=0;j 《 M;j++) fprintf(fp,“%d\t“, s[i].score[j]);
fprintf(fp,“%f\n“, s[i].avg);
对应的fread也要修改。我改好了传上来。
#include《string.h》
#include《stdlib.h》
#define N 20
#define M 3
typedef struct
{
char name;
int score[M];
double avg;
}stu;
void swap(stu*m,stu*n)
{
stu t=*m;
*m=*n;
*n=t;
}
void input(stu*s,int n)
{
int i,j;
double sum=0;
for(i=0;i《n;i++)
{
printf(“请输入姓名:“);
scanf(“%s“,s[i].name);
printf(“请输入分数(英语数C):“);
for(j=0;j《M;j++)
scanf(“%d“,&s[i].score[j]);
printf(“\n“);
}
}
void sort(stu*s,int n)
{
int i,j;
double sum=0;
for(i=0;i《n;i++)
{
for(j=0;j《M;j++)
sum+=s[i].score[j];
s[i].avg=sum/M;
sum=0;
}
for(i=1;i《n;i++)
for(j=0;j《n-i;j++)
{
if(s[j].avg《s[j+1].avg)
swap(&s[j],&s[j+1]);
else if((s[j].avg==s[j+1].avg)&&(strcmp(s[j].name,s[j+1].name)《0))
swap(&s[j],&s[j+1]);
}
}
void save(stu*s,int n)
{
FILE*fp;
int i, j;
fp=fopen(“d:\\data.dat“,“w“);
for(i=0;i《n;i++)
{
//fwrite(&s[i],sizeof(stu),1,fp);
fprintf(fp,“%s\t“, s[i].name);
for(j=0;j 《 M;j++) fprintf(fp,“%d\t“, s[i].score[j]);
fprintf(fp,“%f\n“, s[i].avg);
}
fclose(fp);
}
void output(stu*s,int n)
{
int i=0,j;
FILE*fp;
if((fp=fopen(“d:\\data.dat“,“r“))==NULL)
{
printf(“fail\n“);
exit(0);
}
while(!feof(fp))
{
//fread(&s[i],sizeof(stu),1,fp);
fscanf(fp, “%s“,s[i].name);
for(j=0;j《M; j++) fscanf(fp,“%d“, &s[i].score[j]);
fscanf(fp, “%f“,&s[i].avg);
i++;
}
fclose(fp);
for(i=0;i《n;i++)
{
printf(“%s\t“,s[i].name);
for(j=0;j《M;j++)
printf(“%d “,s[i].score[j]);
printf(“%.1lf“,s[i].avg);
printf(“\n“);
}
}
void main()
{
int n;
stu s[N];
printf(“input n:“);
scanf(“%d“,&n);
input(s,n);
sort(s,n);
save(s,n);
output(s,n);
}
fwrite保存数据,文本打开变乱码
因为写入文件的是二进制数据,所以看上去就是乱码。
#include《stdio.h》
#include《stdlib.h》
#include《time.h》
#define N 10000
int main()
{
int a[N];int i,j,m;
FILE*fw,*fr;
srand((unsigned)time(NULL));
for(i=0;i《1000;i++)
{
a[i]=rand()%1000+1;
} //产生随机数组
fw=fopen(“f:\\intfile.dat“,“wb“);//以二进制方式打开,因为你后面是用二进制方式读的,否则会乱码
if(fw==NULL)
{
printf(“ERROR!“);
exit(0);
}
for(i=0;i《1000;i++)
{
fprintf(fw,“%8d“,a[i]);
} //将随机数组导入文件中
fclose(fw);
fr=fopen(“f:\\intfile.dat“,“rb“);//同理,看上面
while(!feof(fr))
{
fscanf(fr,“%8d“,&j);
printf(“%8d“,j);
}
fclose(fr);
fw=fopen(“f:\\intfile.dat“,“a+b“);//b是binary的意思,要统一
if(fw==NULL)
{
printf(“ERROR!!!“);
exit(0);
}
fwrite(a,sizeof(int),1000,fw);
fclose(fw);
fr=fopen(“f:\\intfile.dat“,“rb“);
fseek(fr,32L,SEEK_SET);
fscanf(fr,“%8d“,&j);
printf(“%8d“,j);
fseek(fr,72L,SEEK_SET);
fscanf(fr,“%8d“,&j);
printf(“%8d“,j);
fseek(fr,-40L,SEEK_END);
fscanf(fr,“%8d“,&j);
printf(“%8d“,j);
fseek(fr,-80L,SEEK_END);
fscanf(fr,“%8d“,&j);
printf(“%8d“,j);
fclose(fr);
return 0;
}
为什么结构体里面的int型变量用fwrite写入文件时显示乱码
乱码才是对的。
你用的是二进制形式打开的文件,int类型占用4字节,你的代码就是把这4字节写入了文件。
相当于就是说你的int比如是0x12345678,写入文件的内容会是 78 56 34 12 (注意,我说的是十六进制码),它不是可读的字符串。你需要的是将int转换为字符串再写入。

更多文章:
易语言网页api接口怎么调用(易语言,怎么读取网页json的api)
2026年10月11日 08:00
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00








