可以读取,用"r"模式打开
文件 ,在读取时用fscanf,例如: struct a b fscanf(fp,"%d %s %c\n",&b.num,b.name,&b.sex)/*格式控制符中的\n是因为文本文件中的记录是以回车符结尾的.*/struct Bookinfo\x0d\x0a{\x0d\x0achar num[20]//书号\x0d\x0a char name[10] //书名\x0d\x0a int jinjia //进价\x0d\x0a int shoujia //售价\x0d\x0a int shuliang//库存数量\x0d\x0a int shouchu //售出\x0d\x0a}\x0d\x0atypedef struct Node_book* pNode_book\x0d\x0astruct Node_book\x0d\x0a{\x0d\x0astruct Bookinfo bookinfo\x0d\x0apNode_book next\x0d\x0a}\x0d\x0a只存
节点的数据域,以二进制文件存放:\x0d\x0aint save(struct pNode_book head)\x0d\x0a{\x0d\x0aif(!head) return 0\x0d\x0aFILE *fp=fopen("info.data","wb")\x0d\x0aint i=0\x0d\x0awhile(head)\x0d\x0a{\x0d\x0afwrite(&head->bookinfo,sizeof(Bookinfo),1,fp)\x0d\x0ai++\x0d\x0ahead=head->next\x0d\x0a}\x0d\x0afclose(fp)\x0d\x0a\x0d\x0areturn i\x0d\x0a} \x0d\x0a\x0d\x0aint readFromFile(struct pNode_book *head)\x0d\x0a{\x0d\x0aFILE *fp=fopen("info.data","rb")\x0d\x0aif(!fp)\x0d\x0a{\x0d\x0aprintf("Can not open the file!\n")\x0d\x0areturn 0\x0d\x0a}\x0d\x0a\x0d\x0astruct pNode_book pCur=NULL\x0d\x0afseek(fp,0,SEEK_END)\x0d\x0along end=ftell(fp)\x0d\x0afseek(fp,0,SEEK_SET)\x0d\x0aint i=0\x0d\x0aif(ftell(fp)!=end)\x0d\x0a{\x0d\x0apNode_book tmpNode=(pNode_book)malloc(sizeof(Node_book))\x0d\x0atmpNode->next=NULL\x0d\x0a\x0d\x0afread(&tmpNode->bookinfo,sizeof(Bookinfo),1,fp)\x0d\x0ai++\x0d\x0a\x0d\x0a*head=tmpNode\x0d\x0apCur=*head\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0aprintf("No record!\n")\x0d\x0areturn 0\x0d\x0a}\x0d\x0a\x0d\x0awhile(ftell(fp)!=end)\x0d\x0a{\x0d\x0apNode_book tmpNode=(pNode_book)malloc(sizeof(Node_book))\x0d\x0atmpNode->next=NULL\x0d\x0a\x0d\x0afread(&tmpNode->bookinfo,sizeof(Bookinfo),1,fp)\x0d\x0ai++\x0d\x0a\x0d\x0apCur->next=tmpNode\x0d\x0apCur=pCur->next\x0d\x0a}\x0d\x0a\x0d\x0afclose(fp)\x0d\x0areturn i\x0d\x0a} \x0d\x0a\x0d\x0a//在vc++下编译。如果在TC下,可能还要做些小修改。\x0d\x0a//我在记事本上写的,你调试下吧!\x0d\x0a//有问题Hi我!
说实话,你这样写问题大。一般来说先建立一个头节点,在建立一个链表,里面包含头节点和计数器。
//链表节点定义
typedef struct _lnode
{
char name[20]
char num[20]
struct _lnode *next
}lnode
typedef struct
{
lnode head
int count
}link_list
这样一个链表的类型就定义好了。通过link_list这个类型来声明一个链表。
然后写插入、删除的函数,这里给你演示插入的函数:
//定义一个链表变量
link_list my_list
//初始化
int init_list(link_list* l)
{
l->head.name[20] = {0}
l->head.num[20] = {0}
l->head.next = NULL
l->count = 0
return 0
}
//从头增加链表节点
int insert_list_head(link_list* l, const char *name, const char *num)
{
/*新建结点*/
lnode* pnew = (lnode*)malloc( sizeof(lnode) )
if( NULL == pnew )
return -1
strcpy(pnew->name, name)
strcpy(pnew->num, num)
pnew->next = NULL
/*在头部插入结点*/
pnew->next = l->head.next
l->head.next = pnew
l->count ++
return 0
}
增加数据时,调用这个函数就行了。
接下来,往文件里写的话,用fopen打开文件,用fwrite往这个文件指针里写你的链表变量就行了。至于你说的什么组数完全没必要,文件里只写入一个链表,读的时候用link_list 这个类型声明一个变量去接收,如果想看读的效果,那就要另外写打印链表每个节点数据区内容的函数了。闲来无事,帮你写一个吧:
//比如要打印my_list里面的内容
struct _lnode *pnode = my_list.head.next
while(pnode != NULL)
{
printf("%s, %s\t", pnode->name, pnode->char)
pnode = pnode->next
}
printf("\n")
效果也可以看了,大功告成辣!
评论列表(0条)