我建立这个链表后老出现乱码,是什么原因?请高手帮我看看,谢谢

/********************建立链表************************/

book *creat_list()
{
book *h,*p,*k,*head=NULL;
FILE *fp;
if((fp=fopen("library","r"))==NULL)
{
return head;
}
else
{
h=(book *)malloc(sizeof(book)); //建立以尾指针为头指针的双向循环链表
h->next=NULL; //首结点为空结点
h->prior=NULL;
fp=fopen("library","r");
while(!feof(fp))
{
p=(book *)malloc(sizeof(book));
fread(p,sizeof(book),1,fp);
if(head==NULL)
{
p->prior=h;
h->next=p;
k=head=p;
}
else
{
k->next=p;
p->prior=k;
k=head=p;
}

}

h->prior=k;
k->next=h;
return head;
}
fclose(fp);
}

/**********************保存链表***********************/

void save(book *head)
{
FILE *fp;
book *p;
if((fp=fopen("library","w"))==NULL)
{
printf("文件不存在!");
exit(0);
}

fp=fopen("library","w");
p=head->next->next;
while(p!=head->next)
{
fwrite(p,sizeof(book),1,fp);
p=p->next;
}
printf("保存成功!");

fclose(fp);
free(head);
}

fread 和 fwrite是二进制方式读写的,所以存到文件中保存成了二进制文件,用记事本之类的文本查看工具看到的肯定是乱码

如果你希望用记事本之类的文本工具查看保存的结果不是乱码,你就应该在程序中使用文本方式读写,使用fprintf 和 fscanf这两个函数

参考资料:http://zhangliancheng.com/2011/04/text-files-vs-binary-files/

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-27
这段函数本身应该没问题,关键是你使用了fwrite函数来保存文件,这样实际上保存的是pointer的内存信息,因此这些信息也应该用fread函数来读取出来,由于保存的是内存信息,因此并不是人可读的ASCII码。

如果想保存为可读信息,应该使用fprintf函数来写入文件中。

我建立这个链表后老出现乱码,是什么原因?请高手帮我看看,谢谢
fread 和 fwrite是二进制方式读写的,所以存到文件中保存成了二进制文件,用记事本之类的文本查看工具看到的肯定是乱码 如果你希望用记事本之类的文本工具查看保存的结果不是乱码,你就应该在程序中使用文本方式读写,使用fprintf 和 fscanf这两个函数 参考资料:http:\/\/zhangliancheng.com\/2011\/04\/text-...

C语言实现链表,为什么我把链表写入文件,文件里面显示的是乱码。下面是...
你的程序并没有写错。数据已经写入的文件,你下次也可以从文件里读入并还原这个链表。这只是一个字符的显示问题,你将一个int数据写入数据,显然占据四个字节,而当你用记事本打开时它就会根据你当前采用的字符集解释这四个字节的含义,然后再显示出来。但由于你存入的是整型数据而不是某个字符集的字符...

链表怎么输出,为什么我输出的是乱码
=0){if((a+b)!=0){node *p=(node *)malloc(sizeof(node));p->x=a,p->y=b;p->next=NULL;node *last=head;if(last){while(last->next)last=last->next;last->next=p;}else head=p;}scanf("%d %d",&a,&b);}node *p;for(p=head;p;p=p->next) printf("%d %d\\n"...

我用ASP和ACCESS做了一个网站,为什么总是出现乱码?急救高手指教!
你首先确定自己是什么编码的。如果你这是静态HTML里的内容,可以通过看到你的编码是gb2312,或者utf8。有时候你用记事本打开HTML时会自动改变编码,这时你可以用记事本再次打开,另存为使之与meta中的编码一致。如果你这个菜单是动态生成的那就把asp页面、数据库的编码也设置成一致。

为什么我打开有的网页会出现乱码,把乱码复制到TXT里就能显示文字了啊...
第一类是由于港台的繁体中文大五码(BIG5)与大陆简体中文(GB2312)不通用造成的;第二类是Win9X\/Win2K系统(菜单、桌面、提示框)显示乱码,这是Win9X\/Win2K注册表中有关字体的部分设置不当引起的;第三类是各种应用程序(包括游戏)本来显示中文的地方出现乱码,形成原因比较复杂,有第二类的乱码原因...

对不起打搅你了,麻烦再帮我看一下这个链表程序,真的不知道为什么会乱码...
可能是会直接读取到到行末, 具体你再问下 第二个问题就是关于读入的时候那个name本来就是地址, 所以不需要再加取地址符 里面实现的功能尽量写成函数形式, 链表采用带头节点的链表来操作, 那样会方便很多的 如果方便的话可以留个邮箱, 到时候发给你些东西看看, 包括一些调试技巧之类的 ...

电脑屏幕出现乱码是什么原因?求高手解答 如下图所示
可能存在两种原因 第一:个别软件问题 第二:显卡驱动问题 回想一下你近期做出的系统改动,包括安装的和升级的所有软件、插件、驱动程序、系统设置 造成这种现象基本是因为某软件调动的显示程序,不被你电脑的显卡或显卡驱动支持,所以乱了,反过来,也有可能是因为显卡驱动程序的不匹配,造成的无法正常显卡...

...feof乱码 文件录入head链表时多出一行 是乱码, 怎么改 怎么加判断...
你的文件既然不是以二进制打开的,何必用feof呢?直接用EOF就行了。

请教一个C语言问题!~为什么我这个输出到文件会出现乱码呢。_百度...
+1,in);函数是会读取in中的字符,这样的话output你才会读到helloworld。至于你所说的出现的乱码,是因为你没有初始化output,所以其会出现乱码,在使用output前使用memset对其进行清空,就不会出现乱码了。你乱码后面出现的helloworld是因为你定义output数组时它的20位之后正好放着input数组的首地址。

用JAVA插入到mysql中出现乱码是什么原因?
5.进入Mysql的dos命令下:进入某数据库后 show full columns from tablename ;查看数据类型,如果不是支持中 文的类型则执行alter table tablename convert to character set gbk 。6.在创建数据库时(用命令创建时)create database databasename CHARACTER SET gbk;这是我当年总结的,现在都用oracle了,...

相似回答