緩存c語言
1. c語言緩沖如何編寫。
這是我的函數,random.txt裡面是1到1000隨模孝機排列的數,問題是如何加入緩沖,使得緩沖區每回只能進去20個數字,然後出緩沖區,出來50行。
你這個要求翻譯成程序可大可小
簡單點來說
#define CacheSize 20
typedef struct cacheItem{int value; char bUsed;} CacheItem;
CacheItem Cache[CacheSize];
CacheItem *pOut=0;
CacheItem *pInput=iCacheArray;
int iCacheLocker=-1;
FILE *fsInputFile = 0;
int bIsJobDone=0;
void threadInput()
{
讀取一個數字
鎖定cache
判定當前輸入cacheitem是否可寫可以的話寫入,
如果可寫pInput->value,pInput->bUsed=1;if(pInput == (Cache+CacheSize))pInput=iCacheArray;else ++Ipnut;
否則停留在當前讀取的位置,等答羨待輸出線程釋放出緩存空間。
釋放cache的鎖定
如果讀取個數達到要求了或者文件末尾,++bIsJobDone;return;
}
void threadOutput()
{
鎖定cache
判定當前輸入cacheitem是否bUsed,如果可有用,輸出pInput->value,pInput->bUsed=0;++pOutput;
如果不可用 判定讀取線程是否結束了bIsJobDone==1?(++bIsJobDone):bIsJobDone;
釋放cache的鎖定旦舉稿
如果bIsJobDone==2,結束輸出線程 return
}
void main()
{
open文件
創建輸入線程
創建輸出線程
while(bIsJobDone!=2);
}
大意如此,你明白撒?
2. C語言中怎麼實現數組的緩存
數組一旦申請了維度是不能更改的。要想改變大小,可以考慮容器,像vector,list等。那可以刪除和拼接。
3. C語言緩存問題:
scanf會跳過空白符,除非是%c。所以你getchar遺留下來的換行被scanf跳過
4. C語言中關於鍵盤緩存區問題
說是 以字元串的格式存儲也可以,但不太准確。
實際上 getchar 是執行這樣一個操作,fgetc( STDIN ),從標准輸入 STDIN 文件中讀取一個字元。
這個STDIN是讓冊以文件形式存在的,而且是帶有緩沖的文件。所以准銀滑旅確的說你的輸入被組織鋒凳成一個文件形式。
5. C語言 緩存文件讀取代碼問題
這里的num表示文件中有效數據的個數。
如果num == -1,那麼for循環讀取文件數據的條件就不會滿足,也就是說,如果過num < 0,for循環就不會執行。
6. 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的原理以及緩沖區在哪裡,請你再提一個問我再回答
7. c語言傳文件清空緩存
scanf("%*[^\n]");
^取反或者「非」,[^\n]就是除了回車什麼都可以被scanf讀到。*表示被讀到了但是不把讀到值或者字元賦值給任何變數。
%*[^\n]就是讀取來自鍵盤的出去回車外的任意字元,並不賦值給變數。
scanf("%*c");
就一個*,和上邊表示一樣就是讀到了不賦值給任何變數。
再看,scanf("%[^\n]%*c",str)讀入一行字元,賦值給str變數。如果c前面沒有*,那麼就需要str後面再寫一個char類型的ch。這就告訴*表示讀到了但是不賦值給任何變數。
那麼scanf("%*[^\n]%*c")這句話,應該能理解了,兩個格式控制符裡面都有*,就是都讀到了都不賦值變數。
讀到這里應該差不多理解了,就是題中的兩句scanf(相當於scanf("%*[^\n]%*c"))讀到了輸入的abc,但是沒有賦值給任何變數。然後到了gets(str4);讀到了def賦值給str4,然後printf("%s\n", str4);後必然顯示def。
清空緩存區用fflush(stdin);這句代碼。
鍵盤輸入的東西都是放在緩沖區的這款區域,有變數過來了就帶走,沒有變數就在那裡呆著等待一個變數來帶它走。但是這個時候緩沖區裡面偶爾會有一些垃圾的字元,而影響了正常的輸入,有的時候用getchar()帶走一個兩個的字元,但是如果還是不見效一句fflush(stdin);就可以了。
8. C語言中如何將結構體中的值賦給BYTE類型的緩存
C語言中將結構體給BYTE緩存賦值時,直接進行拷貝即可。
結配扮構體在內存中是一段連續的內存空間,BYTE緩存(即BYTE數組)也納陸是一段連續的內存空間,直接進行內存拷貝就可以完成賦值操作。
例如:
struct A {
int a;
short b;
} dataStruct;
BYTE dataBuffer[20];
memcpy(dataBuffer, dataStruct, sizeof(struct A)); //對Byte緩存賦值
memcpy(dataStruct, dataBuffer, sizeof(struct A)); //對結構體賦洞賣頃值
9. C語言里如何設置緩沖區,
很簡單的定義一個數組,用兩個變數下標來指向頭和尾,新數據來尾++ 老數據處理完頭++ 兩個下標超過界限時從頭開始循環利用 中間要考慮緩存數據空和數據滿的情況
或者你動態分配空間,來一個信號分配空間,插入隊列鏈表,處理完一個出隊列,釋放空間
10. C語言的輸入緩沖怎麼回事,哪裡有詳細介紹啊
緩沖是標准C中的標准I/O里的機制,標准庫里的I/O語句為了提高讀寫的效率,在實際讀寫之前將數據保存到一段內存中,這段內存就叫緩沖,分全緩沖,行緩沖兩種,全緩沖在緩沖的內存滿了之後做實際的讀寫,行緩沖在遇到換行符之後做實際的讀寫,unix高級環境編程里第五章里有詳細的說明,或者網路也有