当前位置:首页 » 编程语言 » c语言输出缓冲器
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言输出缓冲器

发布时间: 2022-03-02 18:10:22

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语言里“返回值”怎么理解 输入缓冲区 怎么理解

ab
de
a-c1 b-c2 c-c3 null-c4
d-c5 e-c6

getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回, getch返回值是用户输入的ASCII码,出错返回-1.输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行.

getchar(c)中c应为字符串 字符串包过'\0' 若c为单字符则没有'\0'所以输出的是乱码
这仅是本人的理解 不知道对你有没有帮助

④ c语言的printf 它说那三种情况就会把缓冲区内容传给屏幕。那如果我只有一句printf(“vv

所谓缓冲区,就是一段内存,大小是一定的。不同平台不同系统缓冲区大小可能不同。

比如缓冲区大小是100个字节,这样当你用printf打印了100个字节的数据,而且其中没有换行符,同时中间也没有过输入语句。那么当你打印到第100个字节的时候,就会直接输出到屏幕了。


至于你说的printf(“vvvvvv”);

其实是不在这三个之中的。这时会等到程序退出,自动刷缓冲的时候才会显示出来。

比如你写

intmain()
{
printf("vvvvvv");
while(1);//程序会一直死循环在这里,永远打不出来上面的字符。
}

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

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

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

很简单的定义一个数组,用两个变量下标来指向头和尾,新数据来尾++ 老数据处理完头++ 两个下标超过界限时从头开始循环利用 中间要考虑缓存数据空和数据满的情况

或者你动态分配空间,来一个信号分配空间,插入队列链表,处理完一个出队列,释放空间

⑦ c语言 强制把输入缓冲区的内容打印出来,输出到标准设备上!!!

#include<stdio.h>

intmain()
{
charc,c1[100];
setbuf(stdin,c1);//把缓冲区设置成c1
scanf("%c",&c);
printf("c:%c c1:%s ",c,c1);
return0;
}

标准缓冲区实在是找不到怎么搞,弄个数组做个临时缓存吧

⑧ C语言中缓冲区的问题,到底什么是全缓冲和行缓冲

缓冲只提输入输出不直接将信息内容放到指定地点,而是行放到缓冲区,刷新缓冲区的时候才将这些内容输入、出到指定位置。行缓冲就是说每一行刷新一次缓冲区,就是见到换行符的时候把缓冲区的内容送到指定位置,如果是输出的话通常是屏幕。缓冲区一般是一块系统指定的内存区域。

⑨ C语言中如何清空输入输出缓冲区

最简单的是用fflush()函数。
此函数包含在stdio.h头文件中,用来强制将缓冲区中的内容写入文件。
函数原型:int fflush(FILE *stream) ;
函数功能:清除一个流,即清除文件缓冲区.
常用场合:
一、ff(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
二、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结 束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
键盘缓冲区就可能有残余信息问题。
scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中
解决就要在scanf()函数之后加个fflush(stdin)

三、写文件的时候 不会马上进行物理磁盘的文件读写,而是先写入缓存,当缓存中内容达到一定程度后再写
FILE *fp=fopen("a.txt","w");
fprintf(fp,"abcdef");
fflush(fp);

⑩ c语言,scanf函数,在输入一个数据时,如何使数据进去缓冲区

关于清空缓冲区,举例如下:

#include<stdio.h>
intmain()
{
intx;
scanf("%d",&x);
fflush(stdin);//清空输入缓冲
scanf("%d",&x);//清空缓冲区后继续输入
printf("%d ",x);
return0;
}