新手又来请教老师了!!

niuxiaobao 2013-10-10 11:15:55
运行都没问题,为什么记事本里面却出现乱码呢?请老师指教!
#include<stdio.h>
#include<stdlib.h>
#define N 3
//输入学生信息写入文件并在屏幕显示
struct student{
int num;
char name[20];
int score[3];
};

main()
{
FILE *fp;
struct student stu[N];
int i,j;
for(i=0;i<N;i++){
printf("student%d\n",i+1);
printf("num:");
scanf("%d",&stu[i].num);
printf("name:");
scanf("%s",stu[i].name);
for(j=0;j<3;j++){
printf("score%d:",j+1);
scanf("%d",&stu[i].score[j]);
}
}
if((fp=fopen("data.txt","wb"))==NULL){
printf("error");
exit(1);
}
if((fwrite(&stu,sizeof(struct student),N,fp))!=N){
printf("error");
exit(1);
}
fclose(fp);
if((fp=fopen("data.txt","rb"))==NULL){
printf("error");
exit(1);
}
if((fread(&stu,sizeof(struct student),N,fp))!=N){
printf("error");
exit(1);
}
for(i=0;i<N;i++)
printf("%d,%s,%d,%d,%d\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
fclose(fp);
}
...全文
230 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
niuxiaobao 2013-10-11
  • 打赏
  • 举报
回复
引用 13 楼 u010726166 的回复:
你是用fwrite 和 fread 来读写的,他们两个是按字节来读写文件的。 你如果要使得在文本上部显示乱码,可以用fprintf 和 fscanf 来进行格式化的读写 补充: 感觉你的fwrite 和 fread 有点问题

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); //函数用法

if((fwrite(&stu,sizeof(struct student),N,fp))!=N){//stu已经是地址了 不需要再加&  fread也一样

明白,谢谢老师
_新世界 2013-10-11
  • 打赏
  • 举报
回复
你是用fwrite 和 fread 来读写的,他们两个是按字节来读写文件的。 你如果要使得在文本上部显示乱码,可以用fprintf 和 fscanf 来进行格式化的读写 补充: 感觉你的fwrite 和 fread 有点问题

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); //函数用法

if((fwrite(&stu,sizeof(struct student),N,fp))!=N){//stu已经是地址了 不需要再加&  fread也一样

niuxiaobao 2013-10-10
  • 打赏
  • 举报
回复
引用 11 楼 max_min_ 的回复:
[quote=引用 9 楼 niuxiaobao 的回复:] [quote=引用 8 楼 ZouXuanXuan456 的回复:] fp=fopen("data.txt","wb") 打开的时候是二进制形式 ,所以不是乱码 都是二进制
改成fp=fopen("data.txt","w")为什么也是乱码呢?[/quote] 把以前的文件删除了,重新编译下代码,再试试[/quote] 还是不行,什么情况?话说wb和w区别在哪里?我怎么感觉是通用的
max_min_ 2013-10-10
  • 打赏
  • 举报
回复
引用 9 楼 niuxiaobao 的回复:
[quote=引用 8 楼 ZouXuanXuan456 的回复:] fp=fopen("data.txt","wb") 打开的时候是二进制形式 ,所以不是乱码 都是二进制
改成fp=fopen("data.txt","w")为什么也是乱码呢?[/quote] 把以前的文件删除了,重新编译下代码,再试试
niuxiaobao 2013-10-10
  • 打赏
  • 举报
回复
引用 2 楼 Idle_Cloud 的回复:
你的打开读写方式是二进制的方式,记事本里乱码是肯定的,只要用你的程序读出来没有乱码就可以了。
我改成fp=fopen("data.txt","w")和fp=fopen("data.txt","r")也不对啊
niuxiaobao 2013-10-10
  • 打赏
  • 举报
回复
引用 8 楼 ZouXuanXuan456 的回复:
fp=fopen("data.txt","wb") 打开的时候是二进制形式 ,所以不是乱码 都是二进制
改成fp=fopen("data.txt","w")为什么也是乱码呢?
ZouXuanXuan456 2013-10-10
  • 打赏
  • 举报
回复
fp=fopen("data.txt","wb") 打开的时候是二进制形式 ,所以不是乱码 都是二进制
赵4老师 2013-10-10
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
赵4老师 2013-10-10
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
theguycopy 2013-10-10
  • 打赏
  • 举报
回复
楼上通解 长度不够就那样了 用sizeof()等等的控制下 用word打开应该没事
lm_whales 2013-10-10
  • 打赏
  • 举报
回复
1) fcanf,fprintf 配对使用 2)fread,fwrite 配对使用 3)用二进制编辑器查看二进制文件,没有的话VC勉强可用。 4)文本文件,用记事本打开,其他用二进制打开。 5)二进制数据,用文本方式查看往往是乱码。 6)汉字系统下,二进制文件,看着也挺乱的,要有耐心。 7)避免混合使用,二进制和文本读写函数。
Arnold9009 2013-10-10
  • 打赏
  • 举报
回复
因为结构体对齐和变量类型的原因吧,并且写的时候,是以二进制的方式,以结构体占用空间大小为单位进行的 换成以结构体成员的方式,单独将每个成员用sprintf转换成字符串再写入文件
Carl_CCC 2013-10-10
  • 打赏
  • 举报
回复
你的打开读写方式是二进制的方式,记事本里乱码是肯定的,只要用你的程序读出来没有乱码就可以了。
是_这样吗 2013-10-10
  • 打赏
  • 举报
回复
很久没用C++了,说的可能不对,看起来是你是参数没初始化的问题啊 stu里面的参数不是不是初始化一下,int=0 ,char数组也要memset一下?

33,317

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧