您的位置:

缓冲器c语言,c语言缓冲区函数

本文目录一览:

C语言里如何设置缓冲区?

将数据以链表形式顺序存放,新数据总是放在表尾,待处理的数据总是在头结点下的第一个结点,处理完毕则释放空间。

#define BufferSize 1024 // 合适的大小你知道的

typedef struct node {

char *buffer;

struct node *next;

}*linkList;

LinkList *InitList() {

LinkList *head;

head = (char *)malloc(size(node));

head-next = NULL:

return head;

}

void AddData(LinkList *head, char *data) { // 将新数据添加到表尾

LinkList *p = head;

LinkList *anode = (char *)malloc(size(node));

anode-buffer = (char *)malloc(size(BufferSize));

strncpy(anode-buffer,data,BufferSize);

anode-next = NULL:

while(p-next) p = p-next;

p-next = anode;

}

void DealData(LinkList *head) {

LinkList *p = head-next;

if(p) {

head-next = p-next;

// p-buffer指向的数据待处理

free(p-buffer); // 处理完毕,释放空间

free(p);

}

}

C语言里如何设置缓冲区,

将数据以链表形式顺序存放,新数据总是放在表尾,待处理的数据总是在头结点下的第一个结点,处理完毕则释放空间。

缓冲器为暂时置放输出或输入资料的内存。缓冲器内资料自储存设备(如硬盘)来,放置在缓冲器中,须待机送至CPU或其他运算设备。缓冲区(buffer)这个中文译意源自当计算机的高速部件与低速部件通讯时,必须将高速部件的输出暂存到某处,以保证高速部件与低速部件相吻合. 后来这个意思被扩展了,成为"临时存贮区"的意思。

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语言 关于缓冲区的条件判断

首先你要知道对于计算机而言,在取输入的数据的时候是有个缓冲区的,用于将用户读入的素具进行存储,实际上就是一个队列;

对你的第一个问题:

int ch1=getchar();

int ch2=getchar();

int ch3=getchar();

在你输入9回车6回车,那么此时缓冲区的字符数据为入 9回车6回车(实际上计算机认为你输入的是字符9和6,因为getchar是针对字符的,由于你定义的是int型,因此计算机会自动转换为它的ASC码,也就是一个整数,再你输出的时候又是以字符串的形式输出的,计算机又将这个整数(也就是当时的ASC码)转换为字符,这两个转化不用你管,计算机有这个功能称为自动转化),由于getchar是取的单个字符,因此它只取走了前三个字符9 回车 6 最后还有一个回车符停留在缓冲区,那么在用户下一次输入的时候计算机就首先会从回车符开始;

在你输入9空格6空格3回车,情况和上面一样,只是缓冲区里面存放的是 空格 3 回车了,前面的三个都被取走了,那么在用户下一次输入的时候计算机就首先会从空格开始;

对你的第二个问题:

你的想法很美好,但是你忽略了一个事实,

while ((c = getchar()) != '\n')

printf("%c", c);

while循环一定会执行一条语句,而且直到遇到第一个语句块(一般为遇到一个分号,但是if-else除外,因为if-else对计算机而言是一个整体,也就是一个语句块),也就是说当你输入 字符c 回车符的时候,缓冲区里存放的是 c 回车符 ,但是此时计算机会逐个检查你的输入,首先检查c 它不是回车符就printf("%c", c);将c打印出来,然后发现后面还有字符回车,检查一下不符合要求就退出循环,不执行下面的printf("%c", c)(此时的变量c为回车符),因此组后显示的就是一个字符c,关于中间的两次转换和第一个问题的回答是一样的;

还有什么不懂的可以继续交流~~~

C语言中,求内存缓冲区的详细解释!

缓冲区(Buffer)又称为缓存(Cache),是内存空间的一部分。也就是说,在内存中预留了一定的存储空间,用来暂时保存输入或输出的数据,这部分预留的空间就叫做缓冲区。

      缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。