读书人

c语言链表中的文件有关问题

发布时间: 2013-11-18 00:11:49 作者: rapoo

c语言链表中的文件问题
各位大虾,这段东西哪里不对呢?运行时不输出啊
void printall(struct inf *head)/*****************全部输出********************/
{
struct inf *p;
int i,n,x;
FILE *fp;
p=head;
fp=fopen("通讯录.txt","rb+");
if(fp==NULL)
{
printf("未找到文件!\n");
return ;
}
n=sizeof(*fp);
x=sizeof(struct inf);
for(i=0;i<(n/x);i++)
{
fseek(fp,i*sizeof(struct inf),0);
fread(p,sizeof(struct inf),1,fp);
printf("%d号:\t姓名:%s\t电话:%s\n\n",p->num,p->name ,p->tel);
}
fclose(fp);
}
跪求解答!! c语言 文件 链表
[解决办法]


n=sizeof(*fp);
x=sizeof(struct inf);
// 确定这里循环是可以满足循环条件的么?不确定的话,在循环前打印下 n 和x的值各是多少吧
for(i=0;i<(n/x);i++)
{
fseek(fp,i*sizeof(struct inf),0);
fread(p,sizeof(struct inf),1,fp);
printf("%d号:\t姓名:%s\t电话:%s\n\n",p->num,p->name ,p->tel);
}

[解决办法]
貌似sizeof(*fp),这是在计算一个指针所占的字节数,并不是等于指针所指向内容所占字节数。
[解决办法]
不知道这样对不对
fseek(fp,0,SEEK_SET);
fseek(fp,0,SEEK_END);
long longBytes=ftell(fp);// longBytes就是文件的长度
[解决办法]
文件里2进制数据是整个结构大小的若干倍数,字符数组部分比实际使用量要大,所以你会看到一些多于的东西,不过正常操作之下没影响。另外,你要重新申请空间再读入数据,文件里原有的next数据过时无效的,不可以直接引用,得用新申请的空间地址替换...
[解决办法]
"sizeof不能测fp所指向的全体的大小吗?"

sizeof(*fp)不能测fp所指向的全体的大小。sizeof(*fp)返回类型FILE的大小。

以下代码可得到fp所指向的文件的大小:

fseek(fp, 0L, SEEK_END);
n = ftell(fp);//n是文件的字节总数
fseek(fp, 0L, SEEK_SET);

[解决办法]
rb是以二进制的方式读取文件。留住存放的时候是以这种形式存放的嘛?而且存储的结构体 楼主没有贴出代码,不知道是不是定长,或者结构体对齐。
如果楼主是手动写的文件,一行一条的话 那就直接以r的方式打开。
用fscanf就可以了。
[解决办法]
n = sizeof(*fp)错了,n不是那个文件的大小,而是FILE的大小。FILE在C里面自己有一个结构体,主要记录的是缓存区的一些信息。你要取整个文件大小的话估计要读取一遍把。不然你直接依次读取一个struct inf大小,结束判定条件是是否为空。
[解决办法]
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。

读书人网 >C语言

热点推荐