缓冲区和文件的关系
在C中打开一个文件file就将其与一个文件指针(缓冲区文件指针)关联起来了,那么我又几个疑问:
1.文件的数据时怎么传到缓冲区的?是只要两者一关联,传递数据的工作就完全交给操作系统了吗?
2.如果1答案是我猜测的这样,那么是否说明在用fopen打开一个文件时,我们所做的所有对文件的操作,实际都是对缓冲区的操作?
请各位大牛指点。
[解决办法]
如果真的是想要弄清楚这些东西的话,你得仔细学学操作系统原理。
1、文件的数据是由操作系统传送到缓冲区的。确实是在建立关系之后就由操作系统来管理你的所有请求了。详细的过程就有点复杂了,你自己去看书吧。
2、你对文件所做的所有操作都是针对文件进行的。缓冲区只是操作系统为了标准化管理文件而提供的一个工具,这个工具的管理是由操作系统自己来执行的,不许你干涉。实际上你甚至可以在完全不了解的情况下通过高级语言提供的库函数操作文件,而不管什么缓冲区之类的事情。
这个事情就有点像开车,想要转弯的你自己是不会也不可能去搬动转向轮的,只能通过控制方向盘来达到你的目的。而在这里,你也没法自己去识别磁盘上传过来的数据串,只能通过库函数去指示操作系统,让它替你达到你的目的。
这样的形容的话,库函数就好像是方向盘,而操作系统就好像是汽车的转向系统。你不需要去详细了解转向系统的结构和工作原理,只要学会使用方向盘就可以了。
[解决办法]
对文件的操作一般分为两部:第一是将打开文件,就是你所的那样,用fopen打开,相当于建立了才文件的一个对象,第二步就是为此对象创建一个对象的I/O输出流。这个时候对I/O输出流的操作就相当于是对文件的操作!但是实际上不是,你操作的对象是内存中文件对应的缓冲区!存在一个对缓冲区操作和对文件操作不同步的问题!当刷新缓冲区的时候,此时才真正的对磁盘上的文件进行操作。但是一般都认为对缓冲区的操作就是对文件的操作。数据的传输问题都不需要考虑,由操作系统完成的!这个是对底层的抽象,不必在乎其细节。不然,什么都由我们来实现,还不把我们给累死。
记住:打开一个文件时并没哟将文件传输到内存缓冲区,将文件对象和流对应的时候,可以理解成将文件传输到缓冲区了!!
[解决办法]
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express
右边Visual C++ 2010 Express下面的Select language...下拉选‘简体中文’,再按Install Now按钮
然后参考
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\fopen.c
[解决办法]