c语言中链表操作文件问题:修改或删除文件某一内容

_Liweijian 2017-01-31 09:27:26
假设以下情景:
我已经将链表中的数据存储进文件,那么假如我需要修改(或删除)这个文件中的某一内容,我可以将文件内容读取进链表进行修改(或删除)。
那么问题来了
1. 我该怎么把修改后的链表覆盖原文件(覆盖的目的是实现修改或者删除原文件中某一内容的目的)
2. 或者有没有更好的办法?
...全文
1007 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2020-01-18
  • 打赏
  • 举报
回复
如果要提高效率,要用到类似数据库的逻辑删除好了
在数据记录上设置一个标记, 表示是否有效
如果删除了, 把这个标记比如0改成1, 文件大小不变, 不影响前后的内容
直接定位写就好了
words8 2020-01-18
  • 打赏
  • 举报
回复
我现在遇到的情况和你一样 想通过链表实现对文件数据的修改
赵4老师 2018-09-25
  • 打赏
  • 举报
回复
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。http://bbs.csdn.net/topics/391975224
昌西兄 2018-09-21
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
如果你要提高效率,需要定制合理的文件存储方案,使得可以直接移动文件指针,读取需要的部分并进行修改/删除,而不必重新

[quote=引用 5 楼 qq352642663 的回复:]
[quote=引用 3 楼 paschen 的回复:]
如果你要提高效率,需要定制合理的文件存储方案,使得可以直接移动文件指针,读取需要的部分并进行修改/删除,而不必重新全部读入修改再保存

是不是使用fseek和ftell函数就可以实现?[/quote]

是的[/quote]

好牛的
paschen 2017-02-02
  • 打赏
  • 举报
回复
如果你要提高效率,需要定制合理的文件存储方案,使得可以直接移动文件指针,读取需要的部分并进行修改/删除,而不必重新
引用 5 楼 qq352642663 的回复:
[quote=引用 3 楼 paschen 的回复:] 如果你要提高效率,需要定制合理的文件存储方案,使得可以直接移动文件指针,读取需要的部分并进行修改/删除,而不必重新全部读入修改再保存
是不是使用fseek和ftell函数就可以实现?[/quote] 是的
paschen 2017-02-01
  • 打赏
  • 举报
回复
如果你要提高效率,需要定制合理的文件存储方案,使得可以直接移动文件指针,读取需要的部分并进行修改/删除,而不必重新全部读入修改再保存
Potato_Lyy 2017-02-01
  • 打赏
  • 举报
回复
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。http://bbs.csdn.net/topics/391975224
rayw0ng 2017-02-01
  • 打赏
  • 举报
回复
1 重新保存文件就行了; 2 (1)就是最好的办法,除非文件超级大,大到需要自己开发文件系统的程度,可以通过直接写硬盘的方式解决。比如 Oracle 数据库就可以直接访问硬盘分区,比访问数据库文件效率高些。
_Liweijian 2017-02-01
  • 打赏
  • 举报
回复
引用 2 楼 Potato_Lyy 的回复:
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。http://bbs.csdn.net/topics/391975224
谢谢,你分享的方法好像合适,
_Liweijian 2017-02-01
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
如果你要提高效率,需要定制合理的文件存储方案,使得可以直接移动文件指针,读取需要的部分并进行修改/删除,而不必重新全部读入修改再保存
是不是使用fseek和ftell函数就可以实现?
_Liweijian 2017-02-01
  • 打赏
  • 举报
回复
引用 1 楼 loneking2001 的回复:
1 重新保存文件就行了; 2 (1)就是最好的办法,除非文件超级大,大到需要自己开发文件系统的程度,可以通过直接写硬盘的方式解决。比如 Oracle 数据库就可以直接访问硬盘分区,比访问数据库文件效率高些。
目前只是学了c语言然后想用结构体和文件操作等知识来实现一个管理系统而已。所以暂时不会用到数据库。 我的疑惑只是不知道如何使用文件操作函数来修改或者删除文件。 所以我想到了两种实现方式: 1.直接操作文件修改或者删除文件中的内容 2.将文件中的内容读入链表再进行修改删除,然后覆盖原文件。 请问哪种实现方式可行?具体思路是怎么样的呢
二.内核链表 内核链表是一种链表,Linux内核链表都是用这种形式实现的 1.特性 内核链表是一种双向循环链表,内核链表的节点节点结构只有指针域 使用内核链表的时候,将内核链表作为一个成员放入到一个结构体使用 我们在链表找到内核链表结构的地址,通过这个地址就可以找到外部大结构体的地址,通过大结构体就可以访问其的成员 优势: 内核链表突破了保存数据的限制,可以用内核链表来保存任何数据(使用一种链表表示各种类型的数据,通用性很强) 内核链表只有指针域,维护起来更加方便,效率更高 2.使用 内核链表在内核已经被实现,我们只需要调用其接口直接使用即可 内核链表的实现代码在内核源代码的list.h文件 3.源代码分析 (1)节点结构: struct list_head { struct list_head *next, *prev;//前置指针 后置指针 }; (2)初始化 #define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0) (3)插入 //从头部插入 static inline void list_add(struct list_head *new, struct list_head *head)//传入要插入的节点和要插入的链表 { __list_add(new, head, head->next); } //从尾部插入 static inline void list_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } (4)通过节点找到外部结构体的地址 //返回外部结构体的地址,第一个参数是节点地址,第二个参数是外部结构体的类型名,第三个参数是节点在外部结构体的成员名 #define list_entry(ptr, type, member) ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) (5)遍历内核链表 //遍历内核链表 #define list_for_each(pos, head) \ for (pos = (head)->next; pos != (head); \ pos = pos->next) //安全遍历内核链表 #define list_for_each_safe(pos, n, head) \ for (pos = (head)->next, n = pos->next; pos != (head); \ pos = n, n = pos->next) C语言的双链表,可以增加。插入,删除修改,销毁等函数接口。

69,371

社区成员

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

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