scanf取进来总是乱码,为什么

代码张 2016-04-25 12:12:45
#include<stdio.h>
//#include "head.h"
typedef struct STU
{
char name[10];
int num;
int age;
char addr[15];
};
int main()
{
char fname[100]="D:\\C++\\PROJECT\\restart_c\\test.log";
FILE *pfile=fopen(fname,"wt");
char ch;
int i;
struct STU boya[2],boyb[2],*pp,*qq;
pp=boya;
qq=boyb;
printf("\ninput data\n");
for(i=0;i<2;i++,pp++)
{
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
}
pp=boya;
fwrite(pp,sizeof(struct STU),2,pfile);
rewind(pfile);
fread(qq,sizeof(struct STU),2,pfile);
printf("\n\nname\tnumber\tage\taddr\n");
for(i=0;i<2;i++,qq++)
{
printf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,qq->addr);
}
//writelocaltime(pfile);
fclose(pfile);
getchar();
return 0;
}


...全文
979 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
代码张 2016-04-25
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了 对电脑而言没有乱码,只有二进制字节。
谢谢,理解了,
代码张 2016-04-25
  • 打赏
  • 举报
回复
引用 1 楼 ksx_120999 的回复:
代码对file文件操作,除了数字和字符是一样的,其他一律显示为乱码。如果重新读写出来就还是你原来输入的。 乱码没有原因的吧,就像1+1为什么等于2一样。 ---新手个人见解
我觉得,乱码的原因是读取时,字节数不对,又不知道哪儿不对,乱码肯定是有原因的,
代码张 2016-04-25
  • 打赏
  • 举报
回复
引用 3 楼 qq423399099 的回复:
在Debug 模式下,VC 会把未初始化的栈内存全部填成0xcc。会把未初始化的堆内存全部填成0xcd。未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是乱码中的那个“烫”字。同理,0Xcdcd就是“屯”字。 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
原来这样,是因为后面的字节没有被覆盖,而只是初始化的结果,谢谢了,
赵4老师 2016-04-25
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了 对电脑而言没有乱码,只有二进制字节。
fefe82 2016-04-25
  • 打赏
  • 举报
回复
如果希望写入文件的东西人可读,一般应该仅用 fprintf 。
lm_whales 2016-04-25
  • 打赏
  • 举报
回复
t 方式(文本文件)打开 fread,fwrite 本来就容易出问题,应该用 fscanf,fprintf 读写 二进制应该用 b方式打开fread,fwrite读写
小灸舞 版主 2016-04-25
  • 打赏
  • 举报
回复
在Debug 模式下,VC 会把未初始化的栈内存全部填成0xcc。会把未初始化的堆内存全部填成0xcd。未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是乱码中的那个“烫”字。同理,0Xcdcd就是“屯”字。 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
mxway 2016-04-25
  • 打赏
  • 举报
回复
 fwrite(pp,sizeof(struct STU),2,pfile);
是向文件中写 35个字节,结构体中的name占用的值为zhang占用了6个字节(加上'\0'占用的一个字节),但在写的时候也是要写10个字节。后面4个字节是垃圾数据
ksx_120999 2016-04-25
  • 打赏
  • 举报
回复
代码对file文件操作,除了数字和字符是一样的,其他一律显示为乱码。如果重新读写出来就还是你原来输入的。 乱码没有原因的吧,就像1+1为什么等于2一样。 ---新手个人见解

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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