关于文件的二进制存储方式!

#include <stdio.h>
#include <stdlib.h>
#define clear fflush(stdin)
void WriteMessage();
void ReadMessage();
FILE *fp;
char y;
struct user
{
char name[15];
char sex[3];
int age;
char data[200];
}
main()
{
char c;
printf("留言=1,查看留言=2,退出=3.\t");
scanf("%c",&c);
switch(c)
{
case '1':
WriteMessage();
break;
case '2':
ReadMessage();
break;
default:
exit(0);
break;
};
}
void WriteMessage()
{
struct user u;
if((fp=fopen("msg.bin","ab"))==0)
{
fclose(fp);
fp=fopen("msg","wb+");
goto write;
}
else
{
write:
printf("请输入姓名,性别,年龄,留言内容.中间用空格隔开:");
scanf("%s %s %d %s",u.name,u.sex,&u.age,u.data);
fwrite(&u,sizeof(struct user),1,fp);
clear;
fclose(fp);
printf("查看留言吗?(Y/N)");
y=getchar();
if(y=='y'||y=='Y')
{
ReadMessage();
}
else
{
exit(0);
};
};
}
void ReadMessage()
{
struct user u;
int i=0;
int end;
if((fp=fopen("msg.bin","rb"))==0)
{
printf("没有检测到留言本文件,无法查看留言.现在进行留言吗?(Y/N)");
clear;
y=getchar();
if(y=='y'||y=='Y')
{
WriteMessage();
}
else
{
exit(0);
};
}
else
{
fseek(fp,0L,2);
end=ftell(fp);
i=sizeof(struct user);
rewind(fp);
i=end/i;
while(fread(&u,sizeof(struct user),i,fp)==i)
{
printf("%s %s %d %s",u.name,u.sex,u.age,u.data);
printf("\n");
};
fclose(fp);
system("pause");
};
}
请问一下各位~ 我的想法是~
先是把游标移动到最后 然后,ftell(fp)获取文件所有字节数~ 然后 用文件所有字节数除以 一个结构类型的字节数 就等于 这个文件有多少个这样的留言 然后读取的次数就是上面的那个。
我想问一下~
如果,我第一个留言 的成品变量 name 我只用了两个字节,那其余的字节数是不是不被计算在文件内? 也就是说ftell(fp) 返回的是两个字节,而不是20个字节?
[2051 byte] By [Ghost2005-幽靈] at [2008-1-9]
# 1
等待中。。。。
Ghost2005-幽靈 at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...
# 2
看你以什么方式打开的文件.如果以二进制打开的.那么他占的空间就是全部写入文件了的.
在这里你写的是fwrite(&u,sizeof(struct user),1,fp);那他写入的就是sizeof(struct user)这么大.如果做留言建议用链表.
shjmqqc111-新手上路 at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...
# 3
才发现这题没分.失败...
shjmqqc111-新手上路 at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...
# 4
谢谢你了,大哥~~~~ 我新手嘛,分本来就少,所以,没给分,刚开始也打算用链表来做,因为,留言具体是多少条是不能确定的,但是,没有打算完善这个程序,所以,就打算实现就可以了~~~ 对了,我没有明白你的意思,我是想问fread的问题~
Ghost2005-幽靈 at 2007-10-19 > top of Msdn China Tech,C/C++,C语言...