关于文件的二进制存储方式!
#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个字节?

