c語言文件緩沖區
① c語言里如何設置緩沖區,
很簡單的定義一個數組,用兩個變數下標來指向頭和尾,新數據來尾++ 老數據處理完頭++ 兩個下標超過界限時從頭開始循環利用 中間要考慮緩存數據空和數據滿的情況
或者你動態分配空間,來一個信號分配空間,插入隊列鏈表,處理完一個出隊列,釋放空間
② C語言中如何清空輸入輸出緩沖區
最簡單的是用fflush()函數。
此函數包含在stdio.h頭文件中,用來強制將緩沖區中的內容寫入文件。
函數原型:int fflush(FILE *stream) ;
函數功能:清除一個流,即清除文件緩沖區.
常用場合:
一、ff(stdin)刷新標准輸入緩沖區,把輸入緩沖區里的東西丟棄
fflush(stdout)刷新標准輸出緩沖區,把輸出緩沖區里的東西列印到標准輸出設備上。
二、scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結 束)。
① 遇空格、「回車」、「跳格」鍵。
② 遇寬度結束。
③ 遇非法輸入。
鍵盤緩沖區就可能有殘余信息問題。
scanf()函數應該只是掃描stdin流,這個殘存信息是在stdin中
解決就要在scanf()函數之後加個fflush(stdin)
三、寫文件的時候 不會馬上進行物理磁碟的文件讀寫,而是先寫入緩存,當緩存中內容達到一定程度後再寫
FILE *fp=fopen("a.txt","w");
fprintf(fp,"abcdef");
fflush(fp);
③ C語言中fread函數,當文件流緩沖中剩餘長度小於需要讀取的長度時的問題
fread在fp_in緩沖區中剩餘位元組為0的時候才會產生一個異常讓內核去處理,內核收到這個異常,就會讀取文件,將fp_in的緩沖區重新填滿。
也就是說:如果只剩下15個了,你要讀20個,那麼就會先讀15個到g_buffer里,然後產生一個異常,內核重新填滿緩沖區,然後再從緩沖區里讀5個位元組。
④ c語言在文件緩沖區里提前顯示的函數是什麼
int fflush(FILE *stream)
調用這個函數即可
⑤ C語言里如何設置緩沖區
將數據以鏈表形式順序存放,新數據總是放在表尾,待處理的數據總是在頭結點下的第一個結點,處理完畢則釋放空間。
#define BufferSize 1024 // 合適的大小你知道的
typedef struct node {
char *buffer;
struct node *next;
}*linkList;
LinkList *InitList() {
LinkList *head;
head = (char *)malloc(size(node));
head->next = NULL:
return head;
}
void AddData(LinkList *head, char *data) { // 將新數據添加到表尾
LinkList *p = head;
LinkList *anode = (char *)malloc(size(node));
anode->buffer = (char *)malloc(size(BufferSize));
strncpy(anode->buffer,data,BufferSize);
anode->next = NULL:
while(p->next) p = p->next;
p->next = anode;
}
void DealData(LinkList *head) {
LinkList *p = head->next;
if(p) {
head->next = p->next;
// p->buffer指向的數據待處理
free(p->buffer); // 處理完畢,釋放空間
free(p);
}
}
⑥ 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語言中,什麼是緩沖文件系統和文件緩沖區
目前c語言使用的文件系統分為緩沖文件系統(標准i
/
o)和非緩沖文件系統(系統i
/
o)。緩沖文件系統的特點是:在內存開辟一個「緩沖區」,為程序中的每一個文件使用,當執
行讀文件的操作時,從磁碟文件將數據先讀入內存「緩沖區」,裝滿後再從內存「緩沖區」依此讀入接收的變數。執行寫文件的操作時,先將數據寫入內存「緩沖區」,待內存「緩沖區」裝滿後再寫入文件。
因此當程序運行時雖然進行了寫數據操作,但是如果寫入的數據沒有裝滿內存中的緩沖區,就不會將數據寫入到磁碟文件中。當程序運行結束後,系統就會將緩沖區中的數據寫入到磁碟上的文件中,因此就可以看到文件中的內容。
常用的fopen命令就會使用文件讀寫緩沖區,fclose命令關閉文件,把緩沖區中的內容寫入磁碟上的文件中。詳見:
http://study.qqcf.com/web/171/19812.htm
⑧ C語言 關於緩沖區的條件判斷
首先你要知道對於計算機而言,在取輸入的數據的時候是有個緩沖區的,用於將用戶讀入的素具進行存儲,實際上就是一個隊列;
對你的第一個問題:
int ch1=getchar();
int ch2=getchar();
int ch3=getchar();
在你輸入9回車6回車,那麼此時緩沖區的字元數據為入 9回車6回車(實際上計算機認為你輸入的是字元9和6,因為getchar是針對字元的,由於你定義的是int型,因此計算機會自動轉換為它的ASC碼,也就是一個整數,再你輸出的時候又是以字元串的形式輸出的,計算機又將這個整數(也就是當時的ASC碼)轉換為字元,這兩個轉化不用你管,計算機有這個功能稱為自動轉化),由於getchar是取的單個字元,因此它只取走了前三個字元9 回車 6 最後還有一個回車符停留在緩沖區,那麼在用戶下一次輸入的時候計算機就首先會從回車符開始;
在你輸入9空格6空格3回車,情況和上面一樣,只是緩沖區裡面存放的是 空格 3 回車了,前面的三個都被取走了,那麼在用戶下一次輸入的時候計算機就首先會從空格開始;
對你的第二個問題:
你的想法很美好,但是你忽略了一個事實,
while ((c = getchar()) != '\n')
printf("%c", c);
while循環一定會執行一條語句,而且直到遇到第一個語句塊(一般為遇到一個分號,但是if-else除外,因為if-else對計算機而言是一個整體,也就是一個語句塊),也就是說當你輸入 字元c 回車符的時候,緩沖區里存放的是 c 回車符 ,但是此時計算機會逐個檢查你的輸入,首先檢查c 它不是回車符就printf("%c", c);將c列印出來,然後發現後面還有字元回車,檢查一下不符合要求就退出循環,不執行下面的printf("%c", c)(此時的變數c為回車符),因此組後顯示的就是一個字元c,關於中間的兩次轉換和第一個問題的回答是一樣的;
還有什麼不懂的可以繼續交流~~~
⑨ C語言中,求內存緩沖區的詳細解釋!
緩沖區(Buffer)又稱為緩存(Cache),是內存空間的一部分。也就是說,在內存中預留了一定的存儲空間,用來暫時保存輸入或輸出的數據,這部分預留的空間就叫做緩沖區。
緩沖區根據其對應的是輸入設備還是輸出設備,分為輸入緩沖區和輸出緩沖區。
⑩ C語言中setvbuf函數為一個文件創建緩沖,把文件讀取到程序的時候,是不是把數據存儲在這個緩沖區
是
是
必須是有個全局可操作的內存區域。