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 結果和上面的分析一樣