文件打开的本质

Roy_Smiling 2011-09-22 09:07:33
文件打开的本质是什么,
比如:File fp=fopen("a.txt","rw");
是不是把文件复制到内存,然后fp指针指向这块区域?
那数据库文件呢?如果数据非常大呢?
...全文
191 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
暮雨晨舟 2011-09-22
  • 打赏
  • 举报
回复
顶一下~
赵4老师 2011-09-22
  • 打赏
  • 举报
回复
VS2010 Express里面也有fopen的源代码:
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\fopen.c
赵4老师 2011-09-22
  • 打赏
  • 举报
回复
linux里面的fopen有源代码的。
AndyZhang 2011-09-22
  • 打赏
  • 举报
回复
这个要看看计算机组成原理和体系结构

其实不是全部放到内存中,只是通过高速缓冲区将你要修改的或者查看的提到内存中。其他的还是在磁盘上面。
Roy_Smiling 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 youseven 的回复:]

struct _iobuf {//定义一个结构体
char *_ptr;//char型的字符串指针
int _cnt;//int型数据
char *_base;//char型的字符串指针
int _flag;//int型数据
int _file;//int型数据
int _charbuf;//int型数据
int _bufsiz;//int型数据
……
[/Quote]
我的意思是语意上的注释,不是语法上的注释。
Roy_Smiling 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luciferisnotsatan 的回复:]

fp只是一个结构,里面有记录指向文件节点的指针。fread这种才是读数据到内存里。
[/Quote]
内存指针我知道,可是文件节点的指针是什么啊 。
我真的是琦琦 2011-09-22
  • 打赏
  • 举报
回复
struct _iobuf {//定义一个结构体
char *_ptr;//char型的字符串指针
int _cnt;//int型数据
char *_base;//char型的字符串指针
int _flag;//int型数据
int _file;//int型数据
int _charbuf;//int型数据
int _bufsiz;//int型数据
char *_tmpfname;//char型字符串指针
};
这个需要注释么~~~~
失散糖 2011-09-22
  • 打赏
  • 举报
回复
路过帮顶..
无米之炊 2011-09-22
  • 打赏
  • 举报
回复
学习,帮顶。
c语言的文件结构,哪位大侠能给个注释啊:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
qq120848369 2011-09-22
  • 打赏
  • 举报
回复
进程的表项带偏移量,文件结点带实际大小。
luciferisnotsatan 2011-09-22
  • 打赏
  • 举报
回复
可以看下 unix环境高级编程
luciferisnotsatan 2011-09-22
  • 打赏
  • 举报
回复
fp只是一个结构,里面有记录指向文件节点的指针。fread这种才是读数据到内存里。
Roy_Smiling 2011-09-22
  • 打赏
  • 举报
回复
c语言的文件结构,哪位大侠能给个注释啊:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
Roy_Smiling 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangliangffaflgh 的回复:]

文件系统对文件处理方法上又分为:"缓冲文件系统"和"非缓冲文件系统". 缓冲文件系统当文件打开后,系统自动为每个文件开辟一个缓冲区(缓冲区为内存的一个区域),从磁盘向内存加载,要通过文件缓冲区,每当缓冲区满后,送入内存(程序数据区);从内存向磁盘写文件时,先将数据写入缓冲区,每当缓冲区写满后,再一次写入磁盘.
C的文件指针指向的是C定义的一个管理文件的结构体(FILE *fp)。这……
[/Quote]
那对数据库文件的操作是不是也是一样的呢。还有对数据库文件的操作,如果电脑里面没有装相应的数据库管理系统,只有一个数据库文件,能不能想对普通文件的访问一样访问呢?
测试NULL 2011-09-22
  • 打赏
  • 举报
回复
文件系统对文件处理方法上又分为:"缓冲文件系统"和"非缓冲文件系统". 缓冲文件系统当文件打开后,系统自动为每个文件开辟一个缓冲区(缓冲区为内存的一个区域),从磁盘向内存加载,要通过文件缓冲区,每当缓冲区满后,送入内存(程序数据区);从内存向磁盘写文件时,先将数据写入缓冲区,每当缓冲区写满后,再一次写入磁盘.
C的文件指针指向的是C定义的一个管理文件的结构体(FILE *fp)。这个结构体中有文件的打开属性、当前的操作指针位置、文件缓冲区指针、缓冲区地址等很多信息。该结构是C语言操作文件的基础。还有一种操作位置指针(用fseek函数操作)和文件指针有本质上的区别。当然不会是一次全读到内存里。一次只读一个缓冲区大小,例如你的文件之2000B,缓冲区定义的大小假设为512B(具体是多少忘了)。文件被分成4块(前3块512B最后一块464B),一次只读512B,只有当你要访问的内容不在当前缓冲区中时,才重新读一块。具体的缓冲区更新是自动完成的,用户不用管。
Roy_Smiling 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jiuchang 的回复:]

这里面用了缓存的技术,只取一点数据
有兴趣的话可以看看linux下实现这个功能的代码
[/Quote]
我是有兴趣,可是能力不足啊。一直都在windows上搞。没接触过Linux。
用缓存的话,是不是取一点点数据放缓存中,然后fp指向这个缓存的首地址啊?

另外问一下,所谓的缓存是不是就是内存中的一块区域,可以用malloc申请的,然后有个指针指向这个区域啊?
jiuchang 2011-09-22
  • 打赏
  • 举报
回复
这里面用了缓存的技术,只取一点数据
有兴趣的话可以看看linux下实现这个功能的代码

69,371

社区成员

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

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