c緩存類
A. C語言緩存問題:
scanf會跳過空白符,除非是%c。所以你getchar遺留下來的換行被scanf跳過
B. 電腦上網,有哪些緩存類型比如IE瀏覽器的
緩存指的是臨時文件,你在環境變數里能看到的,4個TEMP的文件夾,都是緩存跟臨時文件夾,處理不當的話會影響系統性能的!
我這個是優化過的,沒在C盤了
C. C語言緩沖區的問題:下面是代碼
具體來說是這樣的,scanf的輸入後面必然會有一個回車的.以字元串輸入為例,字元被存進對應的地址里,這個回車就會留在緩沖區(其他格式按系統規定的字長讀入,但無論怎樣,緩沖區都會有一個回車字元),如果我們繼續用scanf的話是沒問題的,因為scanf讀入得內容是重第一個非空字元開始的.當時,如果我們用gets或fgets時,就會將將這個回車讀入,而無法讀入我們 想要的字元.因為gets和fgets是讀到回車就結束讀入的,所以這種情況就要在scanf後面加多一條getchar或fflush語句, 你的理解大致上是正確的,關鍵是要理解這個回車
D. 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的原理以及緩沖區在哪裡,請你再提一個問我再回答
E. C語言中buffer到底是什麼意思是數組緩沖區為什麼一般C程序中都不定義他直接拿來用呢
C語言中buffer是緩沖區的意思。
不定義是不能拿過來直接用的,因為它肯定是在別的地方定義的,比如頭文件,或者是個全局變數等。一般是在編譯器裡面,右鍵這個變數,選gotodifination就可以看到它在哪定義的了。
緩沖區它是內存空間的一部分。也就是說,在內存空間中預留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數據,這部分預留的空間就叫做緩沖區。
(5)c緩存類擴展閱讀
C語言循環buffer的實現
#ifdefined(__CIRCLE_BUFFER__)
//"circle_buffer.h"
#ifndef__CIRCLE_BUFFER_H__
#define__CIRCLE_BUFFER_H__
#ifdefined(__CIRCLE_BUFFER__)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
typedefunsignedcharcb_u8;
typedefunsignedshortintcb_u16;
typedefunsignedintcb_u32;
typedefsignedcharcb_s8;
typedefsignedshortintcb_s16;
typedefsignedintcb_s32;
typedefcharcb_char;
typedefenum{cb_false,cb_true}cb_bool;
typedefstruct{
cb_u8*bufptr;
cb_u32buflen;
cb_u32datalen;
cb_u32readpos;
cb_u32writepos;
}CircleBufferMngr;
typedefstruct{
void(*cb_init)(CircleBufferMngr**,cb_u32);
void(*cb_deinit)(CircleBufferMngr**);
void(*cb_info)(CircleBufferMngr*,cb_char*,cb_u32);
cb_u32(*cb_read)(CircleBufferMngr*,cb_u8*,cb_u32);
cb_u32(*cb_write)(CircleBufferMngr*,cb_u8*,cb_u32);
cb_u32(*cb_datalen)(CircleBufferMngr*);
cb_bool(*cb_full)(CircleBufferMngr*);
cb_bool(*cb_empty)(CircleBufferMngr*);
}CircleBufferApi;
#defineCB_MEMCPYmemcpy
#defineCB_MEMSETmemset
#defineCB_SPRINTsprintf
#defineCB_MALLOCmalloc
#defineCB_MFREEfree
#defineCB_ASSERTassert
#defineCB_SNPRINTsnprintf
#defineCB_TRACEprintf
//鎖定,禁止中斷和任務調度
#defineCB_GLOBAL_LOCK
#defineCB_GLOBAL_UNLOCK
;
#defineCBMA_INITcircleBufApi.cb_init
#defineCBMA_DEINITcircleBufApi.cb_deinit
#defineCBMA_INFOcircleBufApi.cb_info
#defineCBMA_READcircleBufApi.cb_read
#defineCBMA_WRITEcircleBufApi.cb_write
#defineCBMA_DATALENcircleBufApi.cb_datalen
#defineCBMA_FULLcircleBufApi.cb_full
#defineCBMA_EMPTYcircleBufApi.cb_empty
#endif/*__CIRCLE_BUFFER__*/
#endif/*__CIRCLE_BUFFER_H__*/
F. 怎麼在C/C++程序中運用雙緩存,雙線程的大規模數據處理方法
無語了,又是你。。。
緩存在程序里就是依據程序需要申請的一段程序空間,可以用數組,可以用隊列,也可以用鏈表。你說的queue<>是STL提供的已經搭好框架的隊列。
具體需要怎樣的緩存要看你的程序需要。
我舉個例子,假如我是HTTP伺服器程序,每秒收到多個HTTP請求,我會用多進程(多進程比多線程穩定)或者多線程來處理各個請求,主進程等待HTTP服務埠來數據,每來一個請求就起一個線程去處理它。來的數據我就可以放在一個 queue<char*>的數據結構里,這個就是緩存了。每個線程我都傳個指針給他,讓線程自己去訪問其中一個緩存,取出HTTP請求做分析。而隊列中的其他緩存可以繼續接受數據。
創建線程的方法對操作系統有一定的依賴,在windows上一般是用CreateThread以及其相關函數,你可以查MSDN得到更詳細的信息,或者直接網路。在linux或者unix上,一般用folk來起進程,pthread線程庫(例如pthread_create)來操作線程。不過也有不用線程技術,用select epoll等技術的。這些你可以自己查到相應的例子。
希望這些對你有幫助。
G. 怎麼清理c盤的緩存如何快速清理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下的所有文件
3.如果對系統進行過windoes updade升級,則刪除以下文件:
C:\windows\下以 $u... 開頭的隱藏文件
4.然後對磁碟進行碎片整理,整理過程中請退出一切正在運行的程序
5.碎片整理後打開「開始」-「程序」-「附件」-「系統工具」-「系統還原」-「創建一個還原點」(最好以當時的日期作為還原點的名字)
6.打開「我的電腦」-右鍵點系統盤-「屬性」-「磁碟清理」-「其他選項」-單擊系統還原一欄里的「清理」-選擇「是」-ok了
7、在各種軟硬體安裝妥當之後,其實XP需要更新文件的時候就很少了。刪除系統備份文件吧:開始→運行→sfc.exe /purgecache近3xxM。(該命令的作用是立即清除"Windows 文件保護"文件高速緩存,釋放出其所佔據的空間)
8、刪掉\windows\system32\dllcache下dll檔(減去200——300mb),這是備用的dll檔, 只要你已拷貝了安裝文件,完全可以這樣做。
9、刪除不用的輸入法:對很多網友來說,Windows XPt系統自帶的輸入法並不全部都合適自己的使用,比如IMJP8_1 日文輸入法、IMKR6_1 韓文輸入法這些輸入法,如果用不著,我們可以將其刪除。輸入法位於\windows\ime\文件夾中,全部佔用了88M的空間。
10、升級完成發現windows\多了許多類似$NtUninstallQ311889$這些目錄,都幹掉吧,1x-3xM
11、另外,保留著\windows\help目錄下的東西對我來說是一種傷害,呵呵。。。都幹掉!
12、關閉系統還原:系統還原功能使用的時間一長,就會佔用大量的硬碟空間。因此有必要對其進行手工設置,以減少硬碟佔用量。打開"系統屬性"對話框,選擇"系統還原"選項,選擇"在所有驅動器上關閉系統還原"復選框以關閉系統還原。也可僅對系統所在的磁碟或分區設置還原。先選擇系統所在的分區,單擊"配置"按鈕,在彈出的對話框中取消"關閉這個驅動器的系統還原"選項,並可設置用於系統還原的磁碟空間大小。
13、休眠功能會佔用不少的硬碟空間,如果使用得少不妨將共關閉,關閉的方法是的:打開"控制面板",雙擊"電源選項",在彈出的"電源選項屬性"對話框中選擇"休眠"選項卡,取消"啟用休眠"復選框。
14、卸載不常用組件:XP默認給操作系統安裝了一些系統組件,而這些組件有很大一部分是你根本不可能用到的,可以在"添加/刪除Windows組件"中將它們卸載。但其中有一些組件XP默認是隱藏的,在"添加/刪除Windows 組件"中找不到它們,這時可以這樣操作:用記事本打開\windows\inf\sysoc.inf這個文件,用查找/替換功能把文件中的"hide"字元全部替換為空。這樣,就把所有組件的隱藏屬性都去掉了,存檔退出後再運行"添加-刪除程序",就會看見多出不少你原來看不見的選項,把其中那些你用不到的組件刪掉(記住存檔的時候要保存為sysoc.inf,而不是默認的sysoc.txt),如Internat信使服務、傳真服務、Windows messenger,碼表等,大約可騰出近50MB的空間。
15、清除系統臨時文件:系統的臨時文件一般存放在兩個位置中:一個Windows安裝目錄下的Temp文件夾;另一個是C:\Documents and Settings"用戶名"\Local Settings\Temp文件夾(Y:是系統所在的分區)。這兩個位置的文件均可以直接刪除。
16、清除Internet臨時文件:定期刪除上網時產生的大量Internet臨時文件,將節省大量的硬碟空間。打開IE瀏覽器,從"工具"菜單中選擇"Internet選項",在彈出的對話框中選擇"常規"選項卡,在"Internet臨時文件"欄中單擊"刪除文件"按鈕,並在彈出"刪除文件"對話框,選中"刪除所有離線內容"復選框,單擊"確定"按鈕。
17、清除預讀文件:Windows XP的預讀設置雖然可以提高系統速度,但是使用一段時間後,預讀文件夾里的文件數量會變得相當龐大,導致系統搜索花費的時間變長。而且有些應用程序會產生死鏈接文件,更加重了系統搜索的負擔。所以,應該定期刪除這些預讀文件。預計文件存放在Windows XP系統文件夾的Prefetch文件夾中,該文件夾下的所有文件均可刪除。
18、壓縮NTFS驅動器、文件或文件夾:如果你的硬碟採用的是NTFS文件系統,空間實在緊張,還可以考慮啟用NTFS的壓縮功能。右擊要壓縮的驅動器-"屬性"-"常規"-"壓縮磁碟以節省磁碟空間",然後單擊"確定", 在"確認屬性更改"中選擇需要的選項。這樣可以節省約20% 的硬碟空間。在壓縮C盤的時候,最好在安全模式下壓縮,這樣效果要好一些。
19、關閉華醫生Dr.Watson:要關閉Dr.Watson可打開注冊表編輯器,找到"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug"分支,雙擊其下的Auto鍵值名稱,將其"數值數據"改為0,最後按F5刷新使設置生效,這樣就取消它的運行了。也在"開始"->"運行"中輸入"drwtsn32"命令,或者"開始"->"程序"->"附件"->"系統工具"->"系統信息"->"工具"->"Dr Watson",調出系統里的華醫生Dr.Watson ,只保留"轉儲全部線程上下文"選項,否則一旦程序出錯,硬碟會讀很久,並佔用大量空間。如以前有此情況,請查找user.dmp文件,刪除後可節省幾十MB空間。
20、關閉遠程桌面:"我的電腦"->"屬性"->"遠程","遠程桌面"里的"允許用戶遠程連接到這台計算機"勾去掉。
21、取消XP對ZIP支持:Windows XP在默認情況下打開了對zip文件支持,這要佔用一定的系統資源,可選擇"開始→運行",在"運行"對話框中鍵入"regsvr32 /u zipfldr.dll",回車確認即可取消XP對ZIP解壓縮的支持,從而節省系統資源。
22、關閉錯誤報告:當應用程序出錯時,會彈出發送錯誤報告的窗口,其實這樣的錯誤報告對普通用戶而言幾乎沒有任何意義,關閉它是明智的選擇。在"系統屬性"對話框中選擇"高級"選項卡,單擊"錯誤報告"按鈕,在彈出的"錯誤匯報"對話框中,選擇"禁用錯誤匯報"單選項,最後單擊"確定"即可。另外我們也可以從組策略中關閉錯誤報告:從"運行"中鍵入"gpedit.msc",運行"組策略編輯器",展開"計算機配置→管理模板→系統→錯誤報告功能",雙擊右邊設置欄中的"報告錯誤",在彈出的"屬性"對話框中選擇"已禁用"單選框即可將"報告錯誤"禁用。
23、關掉不用的設備:Windows XP總是盡可能為電腦的所有設備安裝驅動程序並進行管理,這不僅會減慢系統啟動的速度,同時也造成了系統資源的大量佔用。針對這一情況,你可在 設備管理器中,將PCMCIA卡、數據機、紅外線設備、列印機埠(LPT1)或者串口(COM1)等不常用的設備停用,方法是雙擊要停用的設備,在其屬性對話框中 的"常規"選項卡中選擇"不要使用這個設備(停用)"。在重新啟動設置即可生效,當需要使用這些設備時再從設備管理器中啟用它們。
24、定期清理系統還原點:打開磁碟清理,選擇其他選項->清理系統還原點,點擊清理。
25、卸載不需要的程序,這個就不用我多說了
26、其它優化:
a 將應用軟體裝在其它硬碟(不要安裝在系統盤下,這對重裝系統也有好處);
b 將"我的文檔"文件夾都轉到其他分區:在桌面的"我的文檔"圖標上是右擊滑鼠,選擇"屬性"->"移動" ;
c 將IE臨時文件夾都轉到其他分區:打開IE瀏覽器,選擇"工具"->"internet選項"->"常規"->"設置"->"移動文件夾";
d 把虛擬內存也轉到其它硬碟;
虛擬內存設置技巧
一般windows XP默認情況下是利用C盤的剩餘空間來做虛擬內存的,因此,C盤的剩餘空間越大,對系統運行就越好,虛擬內存是隨著你的使用而動態地變化的,這樣C盤就容易產生磁碟碎片,影響系統運行速度,所以,最好將虛擬內存設置在其它分區,如D盤中。查看虛擬內存設置情況如下:
右鍵點「我的電腦」,左鍵點「屬性」,點選「高級」選項卡,點「性能」里的「設置」按鈕,再選「高級」選項卡,點下面的「更改」按鈕,所彈出的窗口就是虛擬內存設置窗口,一般默認的虛擬內存是從小到大的一段取值范圍,這就是虛擬內存變化大小的范圍,最好給它一個固定值,這樣就不容易產生磁碟碎片了,具體數值根據你的物理內存大小來定,一般為物理內存的1.5到2倍,如內存為256M,那麼應該設置256*1.5=384M,或者乾脆512M,設置方法如下:
假設內存為256M,虛擬內存放在D盤,先要將默認的清除,保持C盤為選中狀態,單選「無分頁文件(N)」再按「設置」按鈕,此時C盤旁的虛擬內存就消失了,然後選中D盤,單選「自定義大小」,在下面的「初始大小」和「最大值」兩個方框里都添上512,再點一下「設置」按鈕,會看到D盤的旁邊出現了「512-512」的字樣,這樣就說明設置好了,再一路確定,最終,系統會要重新啟動,重啟一下,便完成了設置。
注意:虛擬內存只能有一個,只放在一個盤中。
H. C語言中如何將結構體中的值賦給BYTE類型的緩存
C語言中將結構體給BYTE緩存賦值時,直接進行拷貝即可。
結構體在內存中是一段連續的內存空間,BYTE緩存(即BYTE數組)也是一段連續的內存空間,直接進行內存拷貝就可以完成賦值操作。
例如:
structA{
inta;
shortb;
}dataStruct;
BYTEdataBuffer[20];
memcpy(dataBuffer,dataStruct,sizeof(structA));//對Byte緩存賦值
memcpy(dataStruct,dataBuffer,sizeof(structA));//對結構體賦值
I. C語言中結構體與BYTE類型緩存之間的賦值問題
memcpy(&test1, &(TTTT.STUDENT[51]), sizeof(TTTT)-sizeof(STU)*50)
我好像記得你。