请教把结构体与二进制文件的问题

vipwork 2010-10-25 08:31:54
请问怎样把多个结构体写入到二进制文件中呢?又怎样读出来呢?

最近老师的一个作业时这样的:写一个小程序用链表实现录入信息得存储与读出。
我的思路是这样的,首先定义一个结构体,建立多个结点的链表,存到一个二进制文件,到查询时就依次从这个二进制文件中读出结构体并打印出来,所以才有了刚开始的问题,请大家指教
...全文
332 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaozhi5855 2010-10-26
  • 打赏
  • 举报
回复
首先
CreateFile();
接着
WriteFile();
最后
CloseHandle();
dingshaofengbinbin 2010-10-26
  • 打赏
  • 举报
回复
楼上已经有答案了!!就是直接的read,write就行了。因为结构体本质就是二进制的!可以直接copy二进制的数据到一个结构体中。
dooX8086 2010-10-26
  • 打赏
  • 举报
回复
1。 fread(...) == 0 就是结束,feof() 也可以判断
2。 fread(...) 文件指针会自动下移


既然是读写二进制,那么 fp =fopen(...,"rb或wb等.."); 相应用2进制方式打开文件

//只是读写文件, 用不用链表那就看要求了(起码这里没有必要)
//
vipwork 2010-10-25
  • 打赏
  • 举报
回复
可能我的表述能力实在是不行,再总结一下:
1,我的问题是我不知道怎么判断while的结束条件(我用fread(newNode,sizeof(struct Infom),1,fp)读出数据,怎样才知道结束了呢?)。

2。使用fread(newNode,sizeof(struct Infom),1,fp))只能读出第一块数据,怎样读出第二块,第三块数据,直到结束呢?
dooX8086 2010-10-25
  • 打赏
  • 举报
回复
关于结构体存到文件的读与写。楼上的都给出了,
保存时从头按链结点一个个保存没有什么问题。
在读取时要注意重新建立"链"。下面为描述 。

struct * head, *last;
last = head = malloc(....);//申请内存并清0
fread(head....); //读取第一段数据,把数据填充到 head 指向的内存中。

while(!eof) //读取文件直到结尾或指定数量
{
struct * node = maclloc(...); //申请内存并清0
fread(node....); //读取数据段,把数据填充到 node 指向的内存中。

//重新链接结点
last->next = node;
last = node;

}

从文件读取的链表结点,一定要重新链接
vipwork 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 swl82560397pq 的回复:]
引用 4 楼 vipwork 的回复:
引用楼主 vipwork 的回复:
请问怎样把多个结构体写入到二进制文件中呢?又怎样读出来呢?

最近老师的一个作业时这样的:写一个小程序用链表实现录入信息得存储与读出。
我的思路是这样的,首先定义一个结构体,建立多个结点的链表,存到一个二进制文件,到查询时就依次从这个二进制文件中读出结构体并打印出来,所以才有了刚开始的问题,请大家指教


……
[/Quote]

我还是把代码贴出来一下吧,
//添加员工.pre为尾指针
void addMember(Infom *rear,FILE *fp){

Infom *newNode;
char n[5];


do{
newNode = (Infom *)malloc(sizeof(Infom));

printf("请输入ID:");
scanf("%d",&newNode->ID);

printf("请输入职位:");
scanf("%s",newNode->role);

printf("请输入名字:");
scanf("%s",newNode->name);

printf("请输入年龄:");
scanf("%d",&newNode->age);

printf("请输入身高:");
scanf("%f",&newNode->tall);

printf("请输入体重:");
scanf("%f",&newNode->weight);

printf("请输入工资:");
scanf("%f",&newNode->salary);

printf("请输入入职日期:");
scanf("%d",&newNode->joinDate);

rear->next = newNode;
rear = newNode;
newNode->next = '\0';

printf("确定添加?(Y or N)\n");
scanf("%s",n);
if(n[0] == 'Y' || n[0] == 'y')
{
printf("添加的名单如下");
printf("ID-----角色-----名字-----年龄-----身高-----体重-----工资-----入职日期\n");
printf("%d----%s----%s----%d----%.1f-----%.1f----%.3f----%d\n",newNode->ID,newNode->role,newNode->name,
newNode->age,newNode->tall,newNode->weight,newNode->salary,newNode->joinDate);
fp = fopen("D:\\userlist","a");
fwrite(newNode,sizeof(struct Infom),1,fp);
rewind(fp);
fclose(fp);

}
else free(newNode);
}while(n[0] == 'N' || n[0] == 'n' );

}



这个是读出数据显示到屏幕,就是这块不会写:
void showAll(){
FILE *fp;
Infom *element ;
element = (Infom *)malloc(sizeof(Infom));
fp =fopen("D:\\userlist","r");


if(feof(fp) == 1){
printf("There's no worker here\n");
}
else{

printf("ID-----角色-----名字-----年龄-----身高-----体重-----工资-----入职日期\n");

while((fread(element,sizeof(Infom),1,fp))){

printf("%d----%s----%s----%d----%.1f-----%.1f----%.3f----%d\n",element->ID,element->role,element->name,
element->age,element->tall,element->weight,element->salary,element->joinDate);

};
}

}
小魔菇 2010-10-25
  • 打赏
  • 举报
回复
二进制的读写用fread fwrite
swl82560397pq 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 swl82560397pq 的回复:]
引用 4 楼 vipwork 的回复:
引用楼主 vipwork 的回复:
请问怎样把多个结构体写入到二进制文件中呢?又怎样读出来呢?

最近老师的一个作业时这样的:写一个小程序用链表实现录入信息得存储与读出。
我的思路是这样的,首先定义一个结构体,建立多个结点的链表,存到一个二进制文件,到查询时就依次从这个二进制文件中读出结构体并打印出来,所以才有了刚开始的问题,请大家指教


……
[/Quote]

LZ可以参考下谭浩强《C程序设计》P339
swl82560397pq 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vipwork 的回复:]
引用楼主 vipwork 的回复:
请问怎样把多个结构体写入到二进制文件中呢?又怎样读出来呢?

最近老师的一个作业时这样的:写一个小程序用链表实现录入信息得存储与读出。
我的思路是这样的,首先定义一个结构体,建立多个结点的链表,存到一个二进制文件,到查询时就依次从这个二进制文件中读出结构体并打印出来,所以才有了刚开始的问题,请大家指教


我是用fread和fwrite的,但是不知……
[/Quote]
for循环,
fwrite的第一个参数要变,fp则不用lz操心
vipwork 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 vipwork 的回复:]
请问怎样把多个结构体写入到二进制文件中呢?又怎样读出来呢?

最近老师的一个作业时这样的:写一个小程序用链表实现录入信息得存储与读出。
我的思路是这样的,首先定义一个结构体,建立多个结点的链表,存到一个二进制文件,到查询时就依次从这个二进制文件中读出结构体并打印出来,所以才有了刚开始的问题,请大家指教
[/Quote]

我是用fread和fwrite的,但是不知道怎么写循环来读出多个结构体,循环的结束条件又是什么呢?
旭子 2010-10-25
  • 打赏
  • 举报
回复
read write
swl82560397pq 2010-10-25
  • 打赏
  • 举报
回复
一个一个写
fread
fwrite(&stud[i],sizeof(struct ),1,fp);
jcwKyl 2010-10-25
  • 打赏
  • 举报
回复
二进制文件读写在打开文件时用fopen(filename, "wb"),写用fwrite,读用fread。
链表存储到文件时特别注意指针。你可以先按照你的思路实现一下,然后看看有什么问题。

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧