C语言缓冲区在哪里
缓冲区具体在哪里是与操作系统、编译器相关的
以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的原理以及缓冲区在哪里,请你再提一个问我再回答
C语言中,什么是缓冲文件系统和文件缓冲区?
目前c语言使用的文件系统分为缓冲文件系统(标准i
/
o)和非缓冲文件系统(系统i
/
o)。缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执
行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。
因此当程序运行时虽然进行了写数据操作,但是如果写入的数据没有装满内存中的缓冲区,就不会将数据写入到磁盘文件中。当程序运行结束后,系统就会将缓冲区中的数据写入到磁盘上的文件中,因此就可以看到文件中的内容。
常用的fopen命令就会使用文件读写缓冲区,fclose命令关闭文件,把缓冲区中的内容写入磁盘上的文件中。详见:
C语言中的缓冲区和数据流是一个概念吗
不是一个概念。这两个东西常在从硬盘读取数据的过程中使用。数据流是指你要从硬盘中读取并放到内存的那一段数据,就跟你打开水龙头然后再关上流出的一段水一样。而缓冲区是指你读取的那段数据在内存中存放的区域。
至于为什么要有缓冲区呢?因为硬盘读写很慢,你如果再一个字节一个字节得读,效率会更低。
而内存的读取速度很快,所以先把整段的文字一口气读下来放到缓冲区以后再一个一个转码(从字节码转成字母数字符号汉字)可以大幅度提高运行效率。
C语言里如何设置缓冲区?
将数据以链表形式顺序存放,新数据总是放在表尾,待处理的数据总是在头结点下的第一个结点,处理完毕则释放空间。\x0d\x0a \x0d\x0a#define BufferSize 1024 // 合适的大小你知道的\x0d\x0atypedef struct node {\x0d\x0a char *buffer;\x0d\x0a struct node *next;\x0d\x0a}*linkList;\x0d\x0a \x0d\x0aLinkList *InitList() {\x0d\x0a LinkList *head;\x0d\x0a head = (char *)malloc(size(node));\x0d\x0a head-next = NULL:\x0d\x0a return head;\x0d\x0a}\x0d\x0a \x0d\x0avoid AddData(LinkList *head, char *data) { // 将新数据添加到表尾\x0d\x0a LinkList *p = head;\x0d\x0a LinkList *anode = (char *)malloc(size(node));\x0d\x0a anode-buffer = (char *)malloc(size(BufferSize));\x0d\x0a strncpy(anode-buffer,data,BufferSize);\x0d\x0a anode-next = NULL:\x0d\x0a while(p-next) p = p-next;\x0d\x0a p-next = anode;\x0d\x0a}\x0d\x0a \x0d\x0avoid DealData(LinkList *head) {\x0d\x0a LinkList *p = head-next;\x0d\x0a if(p) {\x0d\x0a head-next = p-next;\x0d\x0a // p-buffer指向的数据待处理\x0d\x0a free(p-buffer); // 处理完毕,释放空间\x0d\x0a free(p);\x0d\x0a }\x0d\x0a}
C语言中,求内存缓冲区的详细解释!
缓冲区(Buffer)又称为缓存(Cache),是内存空间的一部分。也就是说,在内存中预留了一定的存储空间,用来暂时保存输入或输出的数据,这部分预留的空间就叫做缓冲区。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。