c缓存
A. 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的原理以及缓冲区在哪里,请你再提一个问我再回答
B. C语言中缓冲区的问题,到底什么是全缓冲和行缓冲
缓冲只提输入输出不直接将信息内容放到指定地点,而是行放到缓冲区,刷新缓冲区的时候才将这些内容输入、出到指定位置。行缓冲就是说每一行刷新一次缓冲区,就是见到换行符的时候把缓冲区的内容送到指定位置,如果是输出的话通常是屏幕。缓冲区一般是一块系统指定的内存区域。
C. c语言缓冲区的问题
目的是要干什么呢
fflush();和system("pause");没关系啊
D. 在c盘中有哪些缓存文件
C:\WINDOWS\Temp c:\temp 这两个是系统临时文件夹
C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files 这个是IE的临时文件夹,如果长时间上网没有清理的话,那这里面的东西应该很多的。还有就是你的程序是装在C盘吗?那就把它装在非系统盘吧。如常用的QQ。QQGAME这些占的空间会随使用时间和你下载游戏的多少而变化的,一般这两个文件都高达400M以上。
E. c语言清除缓冲区的数据
while(getchar()!='n'); -- 应当是 while(getchar()!='\n'); 这是不断循环取字符,直到取到 Enter 键时结束循环。作用,清除上面一次输入时残留在输入流中的字符。
改用 fflush(stdin); 更佳。
ret = scanf("%d,%d",&a,&b); ret 为成功读得的数据个数。
清除的缓冲区中的残留数据: if (ret != 2) fflush(stdin);
F. 为什么cpu利用率越高,c++编译时ccache缓存效果越好
如果CPU越高的话,那么在编辑的过程中它会不卡,所以的话发热量比较小,所以的话缓冲效果就会越好一点。
G. C语言缓存问题:
scanf会跳过空白符,除非是%c。所以你getchar遗留下来的换行被scanf跳过
H. 怎么清理C磁盘缓存
右键点C盘,工具,磁盘清理。
由于把高速缓存都删掉了,所以系统会暂时变慢的哦。
I. 什么是缓存
通俗的说就是比缓存所在的存储器性能好的小容量(因为贵)存储器,把有可能需要的数据放在缓存里以提高读取速度
J. c语言中关于scanf在缓存里读数据的问题
恩 而且getchar()你也会遇到相同读字符的问题的 fflush()可以解决 以后可能有点麻烦
你补充说的我查了一下 有点眉目
你说的是先输入4 然后是回车 再依次输入+空格1空格2 回车 对吧 第一次输入时变量正确地得到了赋值 在输入缓冲区中留有一个回车符号(好像每一个输入后都会留有至少一个回车符 其他的字符时输入不正确留下的)
当第二次输入的时候读的指针指向回车符 并且满足第一个要赋值的字符的要求 就将回车符赋值给c
然后检查整型的值是否有 发现时一个加号输入错误 将返回输入正确的字符个数 是1
所以while可以执行 就会打印出第一行
接着循环再执行 剩下的就是加号,空格 ,1,空格,2,回车了。然后就会读取空格 1 和2 了 赋值正确执行后返回赋值符号个数3 while继续执行(为什么+和-会读不出来 我现在也不知道 其他的字符可以用上面的规则做出来)
接着剩下的就是回车 就可以再次读取键盘的数据了 你输入的是*空格3空格4 结果和上面的分析一样