① C語言緩沖區的問題:下面是代碼
輸出緩沖區:
c標准規定fflush()函數實現,用來刷新輸出(stdout)緩存的,對於(stdin)是么有意義的,gcc也不能使用fflush(stdin)來刷新,因為gcc么實現它。
那麼為什麼要刷新呢,個人認為是這樣的
打個比方getchar()函數,我們知道他是從界面讀取用戶輸入的字元,讀取之後編譯器就把它放在緩存中,當達到一定值的時候,才寫入文件什麼的,或者我們自己主動調用函數寫進去,這個時候如果你還要讀取字元到另一個文件中,你會發現這個時候不是你要寫入文件的字元,這個時候你就應該刷新下緩存。
打個比較典型的比方:
char
p[]={「a」,「b」,「c」};
printf("%d",strlen(p));
我們發現輸出的數值不是我們想像的3,為什麼,這就是緩存的問題,因為數組p的結束符不是『/0』,系統會從緩存裡面一直讀,根據我的理解如果先刷新下緩存,應該就是3了
對於lz的例子我覺得好像么什麼問題,如果要加刷新緩沖,那我覺得可能是,你sleep(1)的時候,其他程序開始佔用cpu,導致緩存發生變化,導致輸出不正常
刷新緩存在tcp和udp通訊的時候用的很多,lz可以看看這方面資料
② 如何清理電腦緩存
1、運用磁碟清理軟體清理C盤,大約可為C盤釋放50M-800M空間。
2、關閉休眠功能,在開始菜單的運行里輸入 powercfg -h off 指令,關閉休眠,此文件實際大小和物理內存是一樣的,大約可以為C盤釋放1-3G的空間。
3、設置虛擬內存: 計算機屬性>高級系統設置>設置(性能)>高級選項卡>更改(虛擬內存),將C盤設置為無分頁文件,然後把D盤設置成系統管理的大小即可,更改後只有按「設置」按鈕才能生效,最後重啟便完成了設置,此文件默認為物理內存的1.5倍,大約可為C盤釋放2-4G的空間。
4、刪除自動備份文件,運行cmd程序(在「開始–>程序–>附件」中),滑鼠右鍵選擇「以管理員身份運行」;然後,命令行輸入 rd/S/Q c:WINDOWS.OLD
,提示確認是否刪除目標文件夾,輸入y然後回車即可。WINDOWS.OLD為系統的備份文件,時間越久就越大,超過10G都是很正常的。大約可為C盤釋放3G以上空間。
5、把C盤的軟體清理一下,沒用的通過控制面板——程序和功能刪除掉,大約可為C盤釋放50M以上的空間。
6、在完成了C盤瘦身以後,記得要保持良好的習慣,例如:桌面不要放過多的東西、定期為C盤等分區進行磁碟碎片整理。
C盤其他可以刪除的文件。
1、C:\Documents and settings\用戶名\Local settings\temp\下的所有文件可以刪;
2、C:\Documents and setting\用戶名\cookies\所有文件可以刪;
3、C:\Documents and settings\用戶名\Local settings\temporary internet Files\下所有文件(頁面文件)可以刪;
4、C:\Documents and settings\用戶名\Local settings\Histoy\下的所有文件(歷史記錄)可以刪;
5、C:\Documents and settings\用戶名\Recent\下的所有文件(最近瀏覽文件的快捷方式)可以刪;
6、C:\WINDOWS\Temp\下的所有文件(臨時文件)可以刪(c盤哪些文件可以刪除);
7、C:\WINDOWS\ServicePackFiles\ 下的所有文件(升級後的備份文件)可以刪;
8、C:\WINDOWS\SoftWareDistribution\download\ 下的文件可以刪;
9、C:\WINDOWS\System32\dllcache\下dll文檔,這是備用的dll文檔。
10、C:\WINDOWS\driver cache\i386\下的(硬體的備份文件)可以刪。
11、如果進行了windows updade升級那麼C:\windows\以下$u開頭的隱藏文件都可以刪除。
③ 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盤緩存文件夾名稱
1.打開「我的電腦」-「工具」-「文件夾選項」-「查看」-在「顯示所有文件和文件夾」選項前打勾-再按「確定」
2.刪除以下文件夾中的內容:
C:\Documents and Settings\用戶名\Cookies\下的所有文件(保留index文件)
C:\Documents and Settings\用戶名\Local Settings\Temp\下的所有文件(用戶臨時文件)
C:\Documents and Settings\用戶名\LocalSettings\TemporaryInternet Files\下的所有文件(頁面文件)
C:\Documents and Settings\用戶名\Local Settings\History\下的所有文件(歷史紀錄)
C:\Documents and Settings\用戶名\Recent\下的所有文件(最近瀏覽文件的快捷方式)
C:\WINDOWS\Temp\下的所有文件(臨時文件)
C:\WINDOWS\ServicePackFiles(升級sp1或sp2後的備份文件)
C:\WINDOWS\Driver Cache\i386下的壓縮文件(驅動程序的備份文件)
C:\WINDOWS\SoftwareDistribution\download下的所有文件
⑤ 如何在C/C++程序中運用雙緩存雙線程等大規模數據處理的技巧 或者要怎麼做可以一次調入一塊數據進行處理
線程技術主要是用來並行處理一些任務,這些任務之間一般少有邏輯順序上的關聯,所以用線程技術可以提高程序整體的運行速度,特別在其中一些子線程運行速度有很大差距的情況下。
各類軟體使用緩存的方式都不一樣。雙緩存或者多個緩存、緩存池等等方式都有。關鍵在於你的程序需要使用怎樣的緩存結構。比如說你是類似生產者消費者模型的軟體,你也許會使用多個緩存做成隊列,一頭在不斷填充,一頭則不斷消耗,這樣能大大提高整體的數據吞吐速度。
fread不輸入整塊調入,它底層是使用的read之類的函數,對文件句柄進行操作。gets函數則是對指針指向的內存地址操作。這些都是上層邏輯了,離磁碟寄存器很遠。真正加快文件讀取速度的方法有很多,比如把整個文件映射到內存里,又比如跳過磁碟緩存直接大塊讀取內容。這些有的有專門的API函數可用,有的則需要你自己改寫系統底層代碼。
建議你多看看操作系統原理方面的書,可以去試著學習下linux內核代碼和原理,這樣你對這些問題就會有更深的認識。
希望這些建議能幫助你。