C语言文件操作~~~求大牛指导

ly621000 2014-04-16 08:36:59
大牛~~你好。我是一名C新手。现在有一个问题,想请问大家?现在有老师和学生两个结构体,我现在想把两个结构体的信息,通过链表的形式写到一个二进制文件中,问题是,能不能分别从文件中读出,老师和学生结构的信息呢?如果可以,我应该怎么操作呢?在线等~~~~
...全文
263 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
MBSHENG 2014-04-18
  • 打赏
  • 举报
回复
在文件起始的地方指明多少个学生多少个老师,然后依次读取
LubinLew 2014-04-18
  • 打赏
  • 举报
回复
2进制肯定是 fwrite/fread 字符 fprintf/fscanf
赵4老师 2014-04-18
  • 打赏
  • 举报
回复
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。
  • 打赏
  • 举报
回复
引用 12 楼 ly621000 的回复:
[quote=引用 11 楼 zjq9931 的回复:] [quote=引用 10 楼 ly621000 的回复:] [quote=引用 9 楼 zjq9931 的回复:] [quote=引用 7 楼 ly621000 的回复:] 哦,我的想法是将文件中信息读取到链表中,再对链表进行具体的操作,比如增加或者删除,然后再写回文件,将原来的文件中信息覆盖。但是,我的意思是比如原来,a.bin这个文件既有老师的信息,又有学生的信息,现在我只是想删除某个学生的信息,我就想把文件中所有学生的信息,读取到链表中来。由于,刚刚已经说到,文件里有老师和学生两种结构体的信息,我怎么只把学生的信息提取到链表中呢?直接用fread(),好像不行吧~~~
首先,要都读出来。修改后再都写回去。 1.你读的时候能否区分出来老是的信息,学生的信息? 2.如果不能,你要解决这个,可以在文件里面增加索引,或者在链表结构里面增加类型,用于区分。 2.如果能,那就都读出来,修改后再写回去。[/quote] 文件里增加索引? 链表结构增加类型?不好意思~~我是一个新手~~~请问能不能说详细一点呢~~~谢谢了·[/quote] 索引呢,就是增加一个链表以外的内容,写到文件里面,告诉程序,学生的数据是从多少个字节开始,到多少个字节结束(或者个数),老师的数据从多少个字节开始到多少个字节结束(或者个数)。 就像这样: 学生数据的起始地址:100 学生数据的个数:100个(或者10000个字节) 老师数据的起始地址:10000 老师数据的个数:10个(或者1000个字节) [/quote] 如果,增加老师和学生信息由管理员来实现。管理员增加一个学生信息,随后又增加一个老师的信息。管理员增加角色(老师或者学生)信息是随意的。然后写到文件里,老师和学生的信息不是混在一起了嘛?并不是学生信息只存在某一片,老师信息存在某一片呢?[/quote] 1.老师的结构体大小和学生的结构体大小是否一样? 2.如果一样大,那就在结构体中增加类型用来区分就可以了。 3.如果不一样大 (1)最好分开放(分文件,也可同一个文件里面两个块),这样便于维护,就像数据库一样,学生一个表,老师一个表。 (2)如果不分开放,那就在文件里面一链表的形式存放,制定下一个同类型的数据的地址。但是不同类型的数据的第一个数据的起始地址也要在文件里面给出,即,要给一个索引。和一个文件里面两块差不多。但是这样的好处是,修改文件时不用全部重写。
  • 打赏
  • 举报
回复
引用 18 楼 ly621000 的回复:
[quote=引用 16 楼 bigwatercar 的回复:] lz用数据库吧
我也想啊··但是,现在老师明确这么要求的 [/quote] 那就要自己定义文件数据格式了。 内存中保存的链表,内部包含的节点指针只在本次运行中有效,等你写到硬盘,在都会来,那些指针就没用了。 所以主要就是要处理好这种关联关系,比如每个节点增加一个ID,在写入硬盘的时候用这个ID代替指针, 等下次读回来,再根据ID重新建立节点。
ly621000 2014-04-18
  • 打赏
  • 举报
回复
引用 16 楼 bigwatercar 的回复:
lz用数据库吧
我也想啊··但是,现在老师明确这么要求的
如此美丽的你 2014-04-18
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
lz用数据库吧
ly621000 2014-04-18
  • 打赏
  • 举报
回复
引用 13 楼 zjq9931 的回复:
[quote=引用 12 楼 ly621000 的回复:] [quote=引用 11 楼 zjq9931 的回复:] [quote=引用 10 楼 ly621000 的回复:] [quote=引用 9 楼 zjq9931 的回复:] [quote=引用 7 楼 ly621000 的回复:] 哦,我的想法是将文件中信息读取到链表中,再对链表进行具体的操作,比如增加或者删除,然后再写回文件,将原来的文件中信息覆盖。但是,我的意思是比如原来,a.bin这个文件既有老师的信息,又有学生的信息,现在我只是想删除某个学生的信息,我就想把文件中所有学生的信息,读取到链表中来。由于,刚刚已经说到,文件里有老师和学生两种结构体的信息,我怎么只把学生的信息提取到链表中呢?直接用fread(),好像不行吧~~~
首先,要都读出来。修改后再都写回去。 1.你读的时候能否区分出来老是的信息,学生的信息? 2.如果不能,你要解决这个,可以在文件里面增加索引,或者在链表结构里面增加类型,用于区分。 2.如果能,那就都读出来,修改后再写回去。[/quote] 文件里增加索引? 链表结构增加类型?不好意思~~我是一个新手~~~请问能不能说详细一点呢~~~谢谢了·[/quote] 索引呢,就是增加一个链表以外的内容,写到文件里面,告诉程序,学生的数据是从多少个字节开始,到多少个字节结束(或者个数),老师的数据从多少个字节开始到多少个字节结束(或者个数)。 就像这样: 学生数据的起始地址:100 学生数据的个数:100个(或者10000个字节) 老师数据的起始地址:10000 老师数据的个数:10个(或者1000个字节) [/quote] 如果,增加老师和学生信息由管理员来实现。管理员增加一个学生信息,随后又增加一个老师的信息。管理员增加角色(老师或者学生)信息是随意的。然后写到文件里,老师和学生的信息不是混在一起了嘛?并不是学生信息只存在某一片,老师信息存在某一片呢?[/quote] 1.老师的结构体大小和学生的结构体大小是否一样? 2.如果一样大,那就在结构体中增加类型用来区分就可以了。 3.如果不一样大 (1)最好分开放(分文件,也可同一个文件里面两个块),这样便于维护,就像数据库一样,学生一个表,老师一个表。 (2)如果不分开放,那就在文件里面一链表的形式存放,制定下一个同类型的数据的地址。但是不同类型的数据的第一个数据的起始地址也要在文件里面给出,即,要给一个索引。和一个文件里面两块差不多。但是这样的好处是,修改文件时不用全部重写。 [/quote] 老师和学生的结构就是不一样大~~~~因为,我们老师要求文件个数不能超过两个~~老师和学生分文件存,那还是比较方便的~~主要是我们题目还有一个要求,就是选了角色以后(老师、学生、管理员),会需要相应角色输入密码,才能进入相应的功能选择菜单。那这个各自角色的密码,我不是又要创建一个二进制文件?那文件个数就超过2个呢? 谢谢你耐心的解答~~主要才开始接触C语言~~所以,只有多问问你们这些大牛~~~
赵4老师 2014-04-17
  • 打赏
  • 举报
回复
还是用XML格式保存结构体信息比较靠谱。
ly621000 2014-04-17
  • 打赏
  • 举报
回复
引用 11 楼 zjq9931 的回复:
[quote=引用 10 楼 ly621000 的回复:] [quote=引用 9 楼 zjq9931 的回复:] [quote=引用 7 楼 ly621000 的回复:] 哦,我的想法是将文件中信息读取到链表中,再对链表进行具体的操作,比如增加或者删除,然后再写回文件,将原来的文件中信息覆盖。但是,我的意思是比如原来,a.bin这个文件既有老师的信息,又有学生的信息,现在我只是想删除某个学生的信息,我就想把文件中所有学生的信息,读取到链表中来。由于,刚刚已经说到,文件里有老师和学生两种结构体的信息,我怎么只把学生的信息提取到链表中呢?直接用fread(),好像不行吧~~~
首先,要都读出来。修改后再都写回去。 1.你读的时候能否区分出来老是的信息,学生的信息? 2.如果不能,你要解决这个,可以在文件里面增加索引,或者在链表结构里面增加类型,用于区分。 2.如果能,那就都读出来,修改后再写回去。[/quote] 文件里增加索引? 链表结构增加类型?不好意思~~我是一个新手~~~请问能不能说详细一点呢~~~谢谢了·[/quote] 索引呢,就是增加一个链表以外的内容,写到文件里面,告诉程序,学生的数据是从多少个字节开始,到多少个字节结束(或者个数),老师的数据从多少个字节开始到多少个字节结束(或者个数)。 就像这样: 学生数据的起始地址:100 学生数据的个数:100个(或者10000个字节) 老师数据的起始地址:10000 老师数据的个数:10个(或者1000个字节) [/quote] 如果,增加老师和学生信息由管理员来实现。管理员增加一个学生信息,随后又增加一个老师的信息。管理员增加角色(老师或者学生)信息是随意的。然后写到文件里,老师和学生的信息不是混在一起了嘛?并不是学生信息只存在某一片,老师信息存在某一片呢?
  • 打赏
  • 举报
回复
fwrite,可以直接写到文件里面。 但注意:链表,里面的下一个,上一个是内存的地址,并不是文件里面的地址。 另外,什么地方存老师的,什么地方存学生的,这个需要有个索引。 等等,制定文件结构吧。
「已注销」 2014-04-17
  • 打赏
  • 举报
回复
用文件IO流就可以实现吧
  • 打赏
  • 举报
回复
引用 10 楼 ly621000 的回复:
[quote=引用 9 楼 zjq9931 的回复:] [quote=引用 7 楼 ly621000 的回复:] 哦,我的想法是将文件中信息读取到链表中,再对链表进行具体的操作,比如增加或者删除,然后再写回文件,将原来的文件中信息覆盖。但是,我的意思是比如原来,a.bin这个文件既有老师的信息,又有学生的信息,现在我只是想删除某个学生的信息,我就想把文件中所有学生的信息,读取到链表中来。由于,刚刚已经说到,文件里有老师和学生两种结构体的信息,我怎么只把学生的信息提取到链表中呢?直接用fread(),好像不行吧~~~
首先,要都读出来。修改后再都写回去。 1.你读的时候能否区分出来老是的信息,学生的信息? 2.如果不能,你要解决这个,可以在文件里面增加索引,或者在链表结构里面增加类型,用于区分。 2.如果能,那就都读出来,修改后再写回去。[/quote] 文件里增加索引? 链表结构增加类型?不好意思~~我是一个新手~~~请问能不能说详细一点呢~~~谢谢了·[/quote] 索引呢,就是增加一个链表以外的内容,写到文件里面,告诉程序,学生的数据是从多少个字节开始,到多少个字节结束(或者个数),老师的数据从多少个字节开始到多少个字节结束(或者个数)。 就像这样: 学生数据的起始地址:100 学生数据的个数:100个(或者10000个字节) 老师数据的起始地址:10000 老师数据的个数:10个(或者1000个字节)
ly621000 2014-04-17
  • 打赏
  • 举报
回复
引用 9 楼 zjq9931 的回复:
[quote=引用 7 楼 ly621000 的回复:] 哦,我的想法是将文件中信息读取到链表中,再对链表进行具体的操作,比如增加或者删除,然后再写回文件,将原来的文件中信息覆盖。但是,我的意思是比如原来,a.bin这个文件既有老师的信息,又有学生的信息,现在我只是想删除某个学生的信息,我就想把文件中所有学生的信息,读取到链表中来。由于,刚刚已经说到,文件里有老师和学生两种结构体的信息,我怎么只把学生的信息提取到链表中呢?直接用fread(),好像不行吧~~~
首先,要都读出来。修改后再都写回去。 1.你读的时候能否区分出来老是的信息,学生的信息? 2.如果不能,你要解决这个,可以在文件里面增加索引,或者在链表结构里面增加类型,用于区分。 2.如果能,那就都读出来,修改后再写回去。[/quote] 文件里增加索引? 链表结构增加类型?不好意思~~我是一个新手~~~请问能不能说详细一点呢~~~谢谢了·
  • 打赏
  • 举报
回复
引用 7 楼 ly621000 的回复:
哦,我的想法是将文件中信息读取到链表中,再对链表进行具体的操作,比如增加或者删除,然后再写回文件,将原来的文件中信息覆盖。但是,我的意思是比如原来,a.bin这个文件既有老师的信息,又有学生的信息,现在我只是想删除某个学生的信息,我就想把文件中所有学生的信息,读取到链表中来。由于,刚刚已经说到,文件里有老师和学生两种结构体的信息,我怎么只把学生的信息提取到链表中呢?直接用fread(),好像不行吧~~~
首先,要都读出来。修改后再都写回去。 1.你读的时候能否区分出来老是的信息,学生的信息? 2.如果不能,你要解决这个,可以在文件里面增加索引,或者在链表结构里面增加类型,用于区分。 2.如果能,那就都读出来,修改后再写回去。
天下只此一家 2014-04-17
  • 打赏
  • 举报
回复
学习了,,,
ly621000 2014-04-17
  • 打赏
  • 举报
回复
哦,我的想法是将文件中信息读取到链表中,再对链表进行具体的操作,比如增加或者删除,然后再写回文件,将原来的文件中信息覆盖。但是,我的意思是比如原来,a.bin这个文件既有老师的信息,又有学生的信息,现在我只是想删除某个学生的信息,我就想把文件中所有学生的信息,读取到链表中来。由于,刚刚已经说到,文件里有老师和学生两种结构体的信息,我怎么只把学生的信息提取到链表中呢?直接用fread(),好像不行吧~~~
buyong 2014-04-17
  • 打赏
  • 举报
回复
Archive
赵4老师 2014-04-17
  • 打赏
  • 举报
回复
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。
f=fopen(..."wb");
fwrite(&student1,sizeof(struct STUDENT),1,f);
fwrite(&student2,sizeof(struct STUDENT),1,f);
fwrite(&teacher1,sizeof(struct TEACHER),1,f);
fwrite(&teacher2,sizeof(struct TEACHER),1,f);
fclose(f);
f=fopen(..."rb");
fread(&student1,sizeof(struct STUDENT),1,f);
fread(&student2,sizeof(struct STUDENT),1,f);
fread(&teacher1,sizeof(struct TEACHER),1,f);
fread(&teacher2,sizeof(struct TEACHER),1,f);
fclose(f);
加载更多回复(1)

69,382

社区成员

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

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