读取txt文件到链表中出现乱码,求助?

fujiyi0206 2013-07-02 09:35:49
void save(struct student *head)

FILE *write;
struct student *p1;
p1 = head;
if(p1 == NULL)
{
system("cls");
printf("学生信息为空,保存失败!\n");
system("pause");
return;
}

printf("请输入保存的文件名: ");
scanf("%s",filename);

strcat(filename,".txt");
write = fopen(filename,"wb");
while(p1 != NULL)
{
fprintf(write,"%s %s %d %s %s %s %s %s %s %s\n",p1->num,p1->name,p1->age,p1->sex,p1->height,p1->birtday,p1->grades,p1->tel,p1->qq,p1->addr);
p1 = p1->next;
}
fseek(write,0,SEEK_SET);
fclose(write);
printf("保存成功\n");
system("pause");
system("cls");

}

void readfile()
{
char ch;
FILE *fp;
struct student *p = NULL,*q=NULL;
fp = fopen("k.txt","r");

p = (struct student *)malloc(sizeof(struct student));
memset(p,0,sizeof(sizeof(struct student)));
Link = p;
Link->next=NULL;
while(!feof(fp))
{
q=(struct student *)malloc(sizeof(struct student));
memset(q,0,sizeof(sizeof(struct student)));
fscanf(fp, "%s %s %d %s %s %s %s %s %s %s",q->num,q->name,&q->age,q->sex,q->height,q->birtday,q->grades,q->tel,q->qq,q->addr);
printf("刷新学生信息:\n");
printf(" %-4s %-4s %-4d %-4s%-4s%-4s%-4s %-4s %-4s %-4s \n",q->num,q->name,q->age,q->sex,q->height,q->birtday,q->grades,q->tel,q->qq,q->addr);
p->next=q;
p=q;
}
q->next = NULL;

if(fclose(fp))
{
printf("文件异常关闭");
exit(1);
}

fclose(fp);
}


读取出来出现屯屯屯屯屯屯屯屯,但是其它数据正常,说是没有初始化,但是我都开辟内存空间都赋值了啊
...全文
334 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-07-03
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了 printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf和fscanf的返回值。
JoeBlackzqq 2013-07-03
  • 打赏
  • 举报
回复
memset(q,0,sizeof(sizeof(struct student))); 等价于 memset(q,0,sizeof(int)); 等价于 memset(q,0,4);
qzf362269994 2013-07-03
  • 打赏
  • 举报
回复
写错了是再次执行fread()
qzf362269994 2013-07-03
  • 打赏
  • 举报
回复
引用 5 楼 fujiyi0206 的回复:
[quote=引用 3 楼 qzf362269994 的回复:] 为什么不用 fwrite(p1,sizeof(struct student),1,write) 读取用fread(q,sizeof(struct student),1,fp)
这样为什么也总是多读了一次啊?[/quote] 在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。
socrates 2013-07-02
  • 打赏
  • 举报
回复
这能编译过? 1、void save(struct student *head)中的filename变量在哪定义的? 2、void readfile()中,对p申请内存时的大小仅仅是student的长度,如果文件中有多组记录,能存下么? 3、你说的输出乱码的原因在这一句上:memset(p,0,sizeof(sizeof(struct student)));长度不对,两个sizeof()操作符...
fujiyi0206 2013-07-02
  • 打赏
  • 举报
回复
引用 3 楼 qzf362269994 的回复:
为什么不用 fwrite(p1,sizeof(struct student),1,write) 读取用fread(q,sizeof(struct student),1,fp)
这样为什么也总是多读了一次啊?
橡木疙瘩 2013-07-02
  • 打赏
  • 举报
回复
student结构是怎么定义的?
qzf362269994 2013-07-02
  • 打赏
  • 举报
回复
为什么不用 fwrite(p1,sizeof(struct student),1,write) 读取用fread(q,sizeof(struct student),1,fp)
fujiyi0206 2013-07-02
  • 打赏
  • 举报
回复
引用 1 楼 u010936098 的回复:

        fscanf(fp, "%s%s%d%s%s%s%s%s%s%s",q->num,q->name,&q->age,q->sex,q->height,q->birtday,q->grades,q->tel,q->qq,q->addr);
这样试试,fscanf会自己跳过空格。 用格式化输入输出做数据存储总是很多问题,我一般要用纯文本存储数据的话,都是以行为单位写,以行为单位读再进行分析,用csv格式;或者干脆用xml格式。
不行啊,一样的
橡木疙瘩 2013-07-02
  • 打赏
  • 举报
回复

        fscanf(fp, "%s%s%d%s%s%s%s%s%s%s",q->num,q->name,&q->age,q->sex,q->height,q->birtday,q->grades,q->tel,q->qq,q->addr);
这样试试,fscanf会自己跳过空格。 用格式化输入输出做数据存储总是很多问题,我一般要用纯文本存储数据的话,都是以行为单位写,以行为单位读再进行分析,用csv格式;或者干脆用xml格式。

69,369

社区成员

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

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