C语言中,什么是缓冲文件系统和文件缓冲区?

Python013

C语言中,什么是缓冲文件系统和文件缓冲区?,第1张

目前c语言使用的文件系统分为缓冲文件系统(标准i

/

o)和非缓冲文件系统(系统i

/

o)。缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执

行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。

因此当程序运行时虽然进行了写数据操作,但是如果写入的数据没有装满内存中的缓冲区,就不会将数据写入到磁盘文件中。当程序运行结束后,系统就会将缓冲区中的数据写入到磁盘上的文件中,因此就可以看到文件中的内容。

常用的fopen命令就会使用文件读写缓冲区,fclose命令关闭文件,把缓冲区中的内容写入磁盘上的文件中。详见:

http://study.qqcf.com/web/171/19812.htm

缓冲区具体在哪里是与操作系统、编译器相关的

以VC++为例。察看getchar的源代码(src\fgetchar.c),有:

int

__cdecl

_fgetchar

(void){

return(getc(stdin))

}

#undef

getchar

int

__cdecl

getchar

(void){

return

_fgetchar()

}

可见getchar()相当于getc(stdin)

继续察看getc(src\fgetc.c),有一段(为便于阅读,有删减):

int

__cdecl

getc

(FILE

*stream){

int

retval

_ASSERTE(stream

!=

NULL)

_lock_str(stream)

__try

{

retval

=

_getc_lk(stream)

}

__finally

{

_unlock_str(stream)

}

return(retval)

}

这段代码里_lock_str其实是通过Win32

API提供的临街区来锁住文件

接收用户输入发生在_getc_lk,_getc_lk宏调用_filbuf。_filbuf在_filbuf.c中可以查看,这段代码比较长,就不贴出来了

_filbuf主要是调用了_read(_fileno(stream),

stream->_base,

stream->_bufsiz)

而_read最终则是调用了Win32API

ReadFile,以下是用WinDbg输出的getchar的调用栈:

#

ChildEBP

RetAddr

00

0012fe6c

0040a4e7

kernel32!ReadFile

01

0012fea8

0040a3b9

TestStruct!_read_lk+0x107

[read.c

@

146]

02

0012fec0

00403140

TestStruct!_read+0x69

[read.c

@

75]

03

0012fee8

00401290

TestStruct!_filbuf+0xd0

[_filbuf.c

@

127]

04

0012ff08

004012cc

TestStruct!fgetc+0x80

[fgetc.c

@

44]

05

0012ff14

0040103d

TestStruct!getc+0xc

[fgetc.c

@

56]

06

0012ff20

00401058

TestStruct!_fgetchar+0xd

[fgetchar.c

@

37]

07

0012ff28

0040101e

TestStruct!getchar+0x8

[fgetchar.c

@

47]

08

0012ff80

0040115c

TestStruct!main+0xe

[d:\my

programs\teststruct\ts.cpp

@

4]

09

0012ffc0

7c816fe7

TestStruct!mainCRTStartup+0xfc

[crt0.c

@

206]

0a

0012fff0

00000000

kernel32!BaseProcessStart+0x23

可见,getchar最终调用了ReadFile。关于ReadFile的原理以及缓冲区在哪里,请你再提一个问我再回答