| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 674 人关注过本帖
标题:请高手进来帮忙看下这程序
只看楼主 加入收藏
yaozheng
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-5-3
收藏
 问题点数:0 回复次数:5 
请高手进来帮忙看下这程序
想用链表做个通讯录,链表储存好象已经没问题了,但是如何从文件里调出链表出了问题,子程序不写了,不影响阅读.
程序中间片段调试正常,关键问题是将链表储存到文件和从文件里读出链表
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include"E:\我的个人文件\编程\个人练习\结构体\建立链表 函数\建立链表 函数.h"
#include"E:\我的个人文件\编程\个人练习\结构体\输出链表 函数\输出链表 函数.h"
#include"E:\我的个人文件\编程\个人练习\结构体\插入链表 函数\插入链表 函数.h"
#include"E:\我的个人文件\编程\个人练习\结构体\删除链表 函数\删除链表 函数.h"
#define LENTH sizeof(struct student)
#define NUL 0


extern struct student *found(); //声明“建立链表”函数
extern struct student *add(struct student *head); //声明“插入链表”函数
extern struct student *del(struct student *head); //声明“删除链表”函数
extern void print(struct student *head); //声明“输出链表”函数

int main()
{
int m=0,i=0,n=0;
FILE *fp1;
char ch;
struct student *head,*p1,*p2,*p3;
char choose;
p3=(struct student *)malloc(LENTH);
printf("是否读入文件:");
scanf("%c",&ch);
if(ch=='Y')
{
if((fp1=fopen("student_list","rb"))==NUL)
printf("read error!");
fread(p3,4,1,fp1);
head=p3;
fclose(fp1);
}
else
{
head=found();
}
do
{
printf("请输入你要进行的操作A.输出B.插入C.删除D.退出:");
fflush(stdin);
scanf("%c",&choose);
if(choose=='A')
print(head);
else if(choose=='B')
head=add(head);
else if(choose=='C')
head=del(head);
}
while(choose!='D');
p1=p2=head;
while(p1!=NUL)
{
p1=p2->next;
p2=p1;
m++;
}
p1=p2=head;
fp1=fopen("student_list","wb");
while(p2!=NUL)
{
p1=p2->next;
n++;
if(fwrite(p2,LENTH,1,fp1)!=1)
printf("file write error\n");
if(n==1)
p3=p2;
p2=p1;
}
fclose(fp1);
getch();
return 0;
}

其中结构体定义在子程序里,为:
struct student
{
long num;
char name[10];
char sex[6];
char phone[12];
struct student *next;
};

我用的是动态链表啊,调用和储存文件时用指针做啊,不要教我定义结构体数组那种方法,那样浪费内存,别又是无语啊,文件操作我真的不明白,书上说的太简单了,例题只给方法不给原理,换了题型后就不知道该怎么操作了
每次读入文件时只有一个数据是对的,就是链表的第一个节点处的num是对的,其余的全是乱码
以下图片是我存入链表后运行读出的结果,该链表储存有3个节点
图片附件: 游客没有浏览图片的权限,请 登录注册

补充一下,我用的是VC++6.0编译工具!!

[[it] 本帖最后由 yaozheng 于 2008-5-3 19:58 编辑 [/it]]
搜索更多相关主题的帖子: include 通讯录 结构体 子程序 如何 
2008-05-03 18:24
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
你把头文件改称纯字符看看..而且如果里面有汉字也要小心了..汉字编码是2个字节的

学习需要安静。。海盗要重新来过。。
2008-05-03 18:27
zhaoyg
Rank: 1
等 级:新手上路
帖 子:328
专家分:0
注 册:2006-8-28
收藏
得分:0 
LZ的名字好眼熟

麻雀飞上枝头变凤凰,而菜鸟的我飞上枝头却感冒了,为什么我的脑袋如此的不管用呢。
2008-05-03 18:28
yaozheng
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-5-3
收藏
得分:0 
谢谢楼上两位回答,头文件没有问题,因为我在做这个程序的时候,首先是不具备读写和储存的功能的,我试过没问题,而且头文件里的包含的子程序跟文件储存和读写没任何关系,那只是我写的处理链表的函数,
问题的关键是在读写那个地方
2008-05-03 19:56
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
fread(p3, sizeof(struct student), 1, fp1);

//====================
从文件中读取一个节点。

[[it] 本帖最后由 cosdos 于 2008-5-3 20:49 编辑 [/it]]

—>〉Sun〈<—
2008-05-03 20:30
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
if(ch == 'Y')  // 这个地方错误比严重

//=========================================
    文件不存在的错误处理有问题,你的程序中只打印"read error!",文件如果打开失败就不应该调用fread()读取文件中的内容。
    fread()调用错误,fread(p3,4,1,fp1); 是从文件fp1中读取1个4字节的数据存入p3,根据结构的定义与C语言对结构的处理,这样将把读取到的4字节数据存入num。也没有考虑到p3的下一个节点(即p3->next)。
   
//========================================
    先看到这里

[[it] 本帖最后由 cosdos 于 2008-5-3 20:47 编辑 [/it]]

—>〉Sun〈<—
2008-05-03 20:36
快速回复:请高手进来帮忙看下这程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020622 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved