请教:从读取文件内容存到链表的问题

jay314159 2009-09-21 03:14:04
我写了一些代码,想将信息保存到文件,然后重新读取文件内容保存到链表并输出,但是发现输出的内容除了文件原有内容外,还包含了很多乱七八糟的东西,苦思不得其解,特来请教各位高手,谢谢!
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define CLEAR system("cls")
#define PAUSE system("pause")

//运动员结构体;运动员信息存放文件:athlete.txt
struct athlete
{
char ID[10];
char name[15];
char pwd[15];//密码
char sex[5];
char from[15];
int sport; //参加项目
float result;//比赛结果
int mingci;//名次
float score;//排名后的分数
};
//单链表结构体:
typedef struct anode
{
struct athlete adata;// adata为Athlete结构类型的数据
struct anode *next; //后继结点
}aNode,*aLink;//Node为anode类型的结构变量,*aLink为anode类型的指针变量
void addAthlete(aLink alink);
void saveAthlete(aNode* alink);
aLink openAthlete();

int main()
{
aLink alink,temp;
alink=(aNode*)malloc(sizeof(aNode));
temp=(aNode*)malloc(sizeof(aNode));
addAthlete(alink);
temp= openAthlete();
PAUSE;
return;
}

//添加运动员
void addAthlete(aLink alink)
{
aNode *apoint,*arecord,*s; //临时的结构体指针变量
char ch,flag=0,id[10],ctemp[15];
int itemp;
float ftemp;
arecord=alink;
s=alink->next;
CLEAR;
while(arecord->next!=NULL)
{
arecord=arecord->next; //将指针移到链表末尾
}
while(alink)//一次可输入多条记录,输入0结束添加操作
{
while(alink)//输入ID,不可重复
{
printf("请输入ID(输入0返回):");
scanf("%s",&id);
if(strcmp(id,"0")==0)
{return;}
s=alink->next;
while(s)//查询id是否存在
{
if(strcmp(s->adata.ID,id)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)
{
printf("这个ID %d 已存在,重试?(y/n)",id);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
continue;
}
else break;
}
apoint=(aNode*)malloc(sizeof(aNode));
if(!apoint)
{
printf("申请内存失败!\n");
PAUSE;
return;
}
strcpy(apoint->adata.ID,id);
printf("请输入姓名:");
scanf("%s",&ctemp);
strcpy(apoint->adata.name,ctemp);
strcpy(apoint->adata.pwd,"111");
printf("请输入性别:");
scanf("%s",&ctemp);
strcpy(apoint->adata.sex,ctemp);
printf("请输入单位:");
scanf("%s",&ctemp);
strcpy(apoint->adata.from,ctemp);
printf("请输入项目:");
scanf("%d",&itemp);
apoint->adata.sport=itemp;

apoint->adata.result=0.0;
apoint->adata.mingci=0;
apoint->adata.score=0.0;
apoint->next=NULL; //标明这是链表的尾节点
arecord->next=apoint;//将新建的节点加入到链表尾部
arecord=apoint;
saveAthlete(arecord);//保存
}
return;
}
}
//保存到文件
void saveAthlete(aNode* alink)
{
FILE* afp;
aNode *ap;
int count=0;
afp=fopen("athlete.txt","a+");
if(afp==NULL)
{
printf("\n\t打开文件失败!\n");
PAUSE;
return;
}
ap=alink;
while(ap)
{
fprintf(afp,"%10s%15s%15s%5s%15s%5d%5.2f%5d%5.2f\n",
ap->adata.ID,ap->adata.name,ap->adata.pwd,ap->adata.sex,ap->adata.from,ap->adata.sport,
ap->adata.result,ap->adata.mingci,ap->adata.score);
ap=ap->next;
count++;
}
if(count>0)
{
printf("\n\n\t===>已保存到文件,总记录数:%d\n",count);
PAUSE;
}
else
{
CLEAR;
printf("\n\n\t===>链表为空,没有保存记录!\n");
PAUSE;
}
fclose(afp);
}
//从文件读取
aLink openAthlete() //alink 为新链表头指针,为返回值
{
aLink alink;
FILE* afp;
aLink ap,aq;
int c;
afp=fopen("athlete.txt","r");
aq=(aNode*)malloc(sizeof(aNode));
alink=(aNode*)malloc(sizeof(aNode));
aq->next=NULL;
alink->next=aq;
while(!feof(afp))
{
ap=(aNode*)malloc(sizeof(aNode));
aq=(aNode*)malloc(sizeof(aNode));
fread(ap,sizeof(aNode),1,afp);
if(ap==NULL)
{ printf("\n\n\t\t没有记录!\n\t");
PAUSE;
exit(0);
}
printf("%s\t %s\t %s\t %s\t %s\t %d\t %.2f\t %d\t %.2f\n",
ap->adata.ID,ap->adata.name,ap->adata.pwd,ap->adata.sex,ap->adata.from,ap->adata.sport,
ap->adata.result,ap->adata.mingci,ap->adata.score);
fflush(stdin);
ap->next=aq->next;
aq->next=ap;
aq=ap;
}
PAUSE;
fclose(afp);
return alink;
}


...全文
280 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jay314159 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jamesf1982 的回复:]
加一个fseek试试,使用fprintf保存到文件中的长度未必为sizeof(aNode)
[/Quote]

家里fseek,改用fwrite后,记事本的内容看上去是乱码,但读取显示到屏幕时可以显示正确,问题是,显示完文件原有的内容后,还是有一部分显示乱码。

PS:各位大侠赶快帮忙吧~~
如图:
http://www.bbs.stu.edu.cn/upload/Picture/1253521151_2.jpg
liangyonglou 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jay314159 的回复:]
引用 4 楼 jamesf1982 的回复:
引用 2 楼 jay314159 的回复:
引用 1 楼 fengxuxing 的回复:
文件写与文件读最好保持一致的格式来读取。
既然用fread来读,为什么不用fwrite来写,这样格式也不要你来控制了。


我试过用fwrite,但是保存到txt文件时发现只是保存了一堆乱码,乱码中依稀可见系统的某个目录路径名,所以就改用fprintf了。


你既然使用a+打开文件,为何没有fseek到文件末尾呢?


呃,使用追加方式打开的文件,不是默认将文件指针移到文件尾的吗?
[/Quote]

是默认将文件指针移到文件尾
james_hw 2009-09-21
  • 打赏
  • 举报
回复
加一个fseek试试,使用fprintf保存到文件中的长度未必为sizeof(aNode)
jay314159 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jamesf1982 的回复:]
引用 2 楼 jay314159 的回复:
引用 1 楼 fengxuxing 的回复:
文件写与文件读最好保持一致的格式来读取。
既然用fread来读,为什么不用fwrite来写,这样格式也不要你来控制了。


我试过用fwrite,但是保存到txt文件时发现只是保存了一堆乱码,乱码中依稀可见系统的某个目录路径名,所以就改用fprintf了。


你既然使用a+打开文件,为何没有fseek到文件末尾呢?
[/Quote]

呃,使用追加方式打开的文件,不是默认将文件指针移到文件尾的吗?
liangyonglou 2009-09-21
  • 打赏
  • 举报
回复
char id[10]
scanf("%s",&id);这样写不对吧,应该写成scanf("%s",id)吧???
Qlaiaqu 2009-09-21
  • 打赏
  • 举报
回复
那是binary格式存储的,你换一种就行了
james_hw 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jay314159 的回复:]
引用 1 楼 fengxuxing 的回复:
文件写与文件读最好保持一致的格式来读取。
既然用fread来读,为什么不用fwrite来写,这样格式也不要你来控制了。


我试过用fwrite,但是保存到txt文件时发现只是保存了一堆乱码,乱码中依稀可见系统的某个目录路径名,所以就改用fprintf了。
[/Quote]

你既然使用a+打开文件,为何没有fseek到文件末尾呢?
james_hw 2009-09-21
  • 打赏
  • 举报
回复
感觉你应该是保存文件时有问题,把fprintf改成fwrite试试
jay314159 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fengxuxing 的回复:]
文件写与文件读最好保持一致的格式来读取。
既然用fread来读,为什么不用fwrite来写,这样格式也不要你来控制了。

[/Quote]
我试过用fwrite,但是保存到txt文件时发现只是保存了一堆乱码,乱码中依稀可见系统的某个目录路径名,所以就改用fprintf了。
Qlaiaqu 2009-09-21
  • 打赏
  • 举报
回复
文件写与文件读最好保持一致的格式来读取。
既然用fread来读,为什么不用fwrite来写,这样格式也不要你来控制了。

69,373

社区成员

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

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