C语言中fopen函数打开文件后,文件以何种方式读入内存?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中fopen函数打开文件后,文件以何种方式读入内存?相关的知识,希望对你有一定的参考价值。

具体的说就是:如果打开文件成功获取文件指针后,按行读取文件。文件是一次性的从磁盘中被读入内存还是以一种什么样的方式读入。如果文件较大,一次读入不了内存,又会有怎么样的现象。请详细的描述下文件从磁盘读到内存的过程。

现在大多数的系统采用分页机制,在打开文件成功后,文件并没有加载进入内存,而是内核生成了一个文件描述符,文件描述符含有一个指向文件indoe结构的指针,在这个结构中存有文件真正的节点信息和位置。当读取的时候,cpu首先判定需要读取的位置是否在内存上,如果再则直接读取(没有所谓的按行读取一说,按行读取不过是找文件中的换行标而已,当读到换行符的时候返回结果),如果不在内存上,则通过内存管理器进行加载,实际上,无论你是读取一个字符还是一行,加载的大小是固定的,比如系统机制是加载1M,当你文件大于1M时也只加载1M,当不够时全部加载。对不不同系统方式不同。(当然系统如果对读文件有特殊的优化也不同),当你读取之后,文件是继续留在内存还是释放,这里有另一套极其复杂的机制在管理。因为在你读第一行和第二行的时间里,还有许多事情在并发的执行。 参考技术A 打开文件后, 读文件有一个缓冲区, 真正读文件是按块读的。
一块多大和你系统有关。比如读4K到内存。
然后 程序的读函数, 是从缓冲区去读的。 要读的数据, 在缓冲区里面就直接读到程序。
不在, 那么清掉缓冲, 重新读一次文件对应位置。
参考技术B C语言fopen函数用于打开文件。
函数原型:FILE * fopen(const char * path,const char * mode);
参数:
path 字符串类型,表示文件所在的路径,包括文件名
mode 打开文件的模式、
返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。
mode:
r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读写数据,文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
实例:
#include<stdio.h>

#define F_PATH "d:\\myfile\\file.dat"
int main(void)

FILE*fp=NULL;//需要注意
fp=fopen(F_PATH,"r");
if(NULL==fp)

return -1;//要返回错误代码

fclose(fp);
fp=NULL;//需要指向空,否则会指向原打开文件地址

return 0;
参考技术C 那要看你指定什么方式送入,字符,字符串还是一组数据,内存存取速度很快,windows 启动,把指令和数据读入内存都这么快,更何况其他程序。 参考技术D http://blog.csdn.net/gdujian0119/article/details/6911620

以上是关于C语言中fopen函数打开文件后,文件以何种方式读入内存?的主要内容,如果未能解决你的问题,请参考以下文章

系统文件IO操作与文件描述符

c语言库函数的打开文件函数

Linux:基础IO

Linux:基础IO

Linux:基础IO

打开文件和关闭文件