user-0 提问: C语言文件操作~~~求大牛指导

回复:
user: user-1
content: 在文件起始的地方指明多少个学生多少个老师，然后依次读取

user: user-2
content: 2进制肯定是 fwrite/fread 字符 fprintf/fscanf

user: user-3
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。

user: user-4
content: 引用 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）如果不分开放，那就在文件里面一链表的形式存放，制定下一个同类型的数据的地址。但是不同类型的数据的第一个数据的起始地址也要在文件里面给出，即，要给一个索引。和一个文件里面两块差不多。但是这样的好处是，修改文件时不用全部重写。

user: user-5
content: 引用 18 楼 ly621000 的回复:[quote=引用 16 楼 bigwatercar 的回复:] lz用数据库吧  我也想啊··但是，现在老师明确这么要求的 [/quote] 那就要自己定义文件数据格式了。 内存中保存的链表，内部包含的节点指针只在本次运行中有效，等你写到硬盘，在都会来，那些指针就没用了。 所以主要就是要处理好这种关联关系，比如每个节点增加一个ID，在写入硬盘的时候用这个ID代替指针， 等下次读回来，再根据ID重新建立节点。

user: user-0
content: 引用 16 楼 bigwatercar 的回复:lz用数据库吧  我也想啊··但是，现在老师明确这么要求的

user: user-6

user: user-5
content: lz用数据库吧

user: user-0
content: 引用 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语言~~所以，只有多问问你们这些大牛~~~

user: user-3
content: 还是用XML格式保存结构体信息比较靠谱。

user: user-0
content: 引用 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]   如果，增加老师和学生信息由管理员来实现。管理员增加一个学生信息，随后又增加一个老师的信息。管理员增加角色（老师或者学生）信息是随意的。然后写到文件里，老师和学生的信息不是混在一起了嘛？并不是学生信息只存在某一片，老师信息存在某一片呢？

user: user-4
content: fwrite，可以直接写到文件里面。 但注意：链表，里面的下一个，上一个是内存的地址，并不是文件里面的地址。 另外，什么地方存老师的，什么地方存学生的，这个需要有个索引。 等等，制定文件结构吧。

user: user-7
content: 用文件IO流就可以实现吧

user: user-4
content: 引用 10 楼 ly621000 的回复:[quote=引用 9 楼 zjq9931 的回复:] [quote=引用 7 楼 ly621000 的回复:] 哦，我的想法是将文件中信息读取到链表中，再对链表进行具体的操作，比如增加或者删除，然后再写回文件，将原来的文件中信息覆盖。但是，我的意思是比如原来，a.bin这个文件既有老师的信息，又有学生的信息，现在我只是想删除某个学生的信息，我就想把文件中所有学生的信息，读取到链表中来。由于，刚刚已经说到，文件里有老师和学生两种结构体的信息，我怎么只把学生的信息提取到链表中呢？直接用fread()，好像不行吧~~~ 首先，要都读出来。修改后再都写回去。 1.你读的时候能否区分出来老是的信息，学生的信息？ 2.如果不能，你要解决这个，可以在文件里面增加索引，或者在链表结构里面增加类型，用于区分。 2.如果能，那就都读出来，修改后再写回去。[/quote] 文件里增加索引？ 链表结构增加类型？不好意思~~我是一个新手~~~请问能不能说详细一点呢~~~谢谢了·[/quote] 索引呢，就是增加一个链表以外的内容，写到文件里面，告诉程序，学生的数据是从多少个字节开始，到多少个字节结束（或者个数），老师的数据从多少个字节开始到多少个字节结束（或者个数）。  就像这样： 学生数据的起始地址：100 学生数据的个数：100个（或者10000个字节） 老师数据的起始地址：10000 老师数据的个数：10个（或者1000个字节）

user: user-0
content: 引用 9 楼 zjq9931 的回复:[quote=引用 7 楼 ly621000 的回复:] 哦，我的想法是将文件中信息读取到链表中，再对链表进行具体的操作，比如增加或者删除，然后再写回文件，将原来的文件中信息覆盖。但是，我的意思是比如原来，a.bin这个文件既有老师的信息，又有学生的信息，现在我只是想删除某个学生的信息，我就想把文件中所有学生的信息，读取到链表中来。由于，刚刚已经说到，文件里有老师和学生两种结构体的信息，我怎么只把学生的信息提取到链表中呢？直接用fread()，好像不行吧~~~ 首先，要都读出来。修改后再都写回去。 1.你读的时候能否区分出来老是的信息，学生的信息？ 2.如果不能，你要解决这个，可以在文件里面增加索引，或者在链表结构里面增加类型，用于区分。 2.如果能，那就都读出来，修改后再写回去。[/quote]    文件里增加索引？ 链表结构增加类型？不好意思~~我是一个新手~~~请问能不能说详细一点呢~~~谢谢了·

user: user-4
content: 引用 7 楼 ly621000 的回复:哦，我的想法是将文件中信息读取到链表中，再对链表进行具体的操作，比如增加或者删除，然后再写回文件，将原来的文件中信息覆盖。但是，我的意思是比如原来，a.bin这个文件既有老师的信息，又有学生的信息，现在我只是想删除某个学生的信息，我就想把文件中所有学生的信息，读取到链表中来。由于，刚刚已经说到，文件里有老师和学生两种结构体的信息，我怎么只把学生的信息提取到链表中呢？直接用fread()，好像不行吧~~~ 首先，要都读出来。修改后再都写回去。 1.你读的时候能否区分出来老是的信息，学生的信息？ 2.如果不能，你要解决这个，可以在文件里面增加索引，或者在链表结构里面增加类型，用于区分。 2.如果能，那就都读出来，修改后再写回去。

user: user-8
content: 学习了，，，

user: user-0
content: 哦，我的想法是将文件中信息读取到链表中，再对链表进行具体的操作，比如增加或者删除，然后再写回文件，将原来的文件中信息覆盖。但是，我的意思是比如原来，a.bin这个文件既有老师的信息，又有学生的信息，现在我只是想删除某个学生的信息，我就想把文件中所有学生的信息，读取到链表中来。由于，刚刚已经说到，文件里有老师和学生两种结构体的信息，我怎么只把学生的信息提取到链表中呢？直接用fread()，好像不行吧~~~

user: user-9
content: Archive

user: user-3
content: 所谓修改删除文件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);