① 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語言里「返回值」怎麼理解 輸入緩沖區 怎麼理解
ab
de
a-c1 b-c2 c-c3 null-c4
d-c5 e-c6
getchar有一個int型的返回值.當程序調用getchar時.程序就等著用戶按鍵.用戶輸入的字元被存放在鍵盤緩沖區中.直到用戶按回車為止(回車字元也放在緩沖區中).當用戶鍵入回車之後,getchar才開始從stdin流中每次讀入一個字元.getchar函數的返回值是用戶輸入的第一個字元的ASCII碼,如出錯返回-1,且將用戶輸入的字元回顯到屏幕.如用戶在按回車之前輸入了不止一個字元,其他字元會保留在鍵盤緩存區中,等待後續getchar調用讀取.也就是說,後續的getchar調用不會等待用戶按鍵,而直接讀取緩沖區中的字元,直到緩沖區中的字元讀完為後,才等待用戶按鍵.
getch與getchar基本功能相同,差別是getch直接從鍵盤獲取鍵值,不等待用戶按回車,只要用戶按一個鍵,getch就立刻返回, getch返回值是用戶輸入的ASCII碼,出錯返回-1.輸入的字元不會回顯在屏幕上.getch函數常用於程序調試中,在調試時,在關鍵位置顯示有關的結果以待查看,然後用getch函數暫停程序運行,當按任意鍵後程序繼續運行.
getchar(c)中c應為字元串 字元串包過'\0' 若c為單字元則沒有'\0'所以輸出的是亂碼
這僅是本人的理解 不知道對你有沒有幫助
④ c語言的printf 它說那三種情況就會把緩沖區內容傳給屏幕。那如果我只有一句printf(「vv
所謂緩沖區,就是一段內存,大小是一定的。不同平台不同系統緩沖區大小可能不同。
比如緩沖區大小是100個位元組,這樣當你用printf列印了100個位元組的數據,而且其中沒有換行符,同時中間也沒有過輸入語句。那麼當你列印到第100個位元組的時候,就會直接輸出到屏幕了。
至於你說的printf(「vvvvvv」);
其實是不在這三個之中的。這時會等到程序退出,自動刷緩沖的時候才會顯示出來。
比如你寫
intmain()
{
printf("vvvvvv");
while(1);//程序會一直死循環在這里,永遠打不出來上面的字元。
}
⑤ C語言中,求內存緩沖區的詳細解釋!
緩沖區(Buffer)又稱為緩存(Cache),是內存空間的一部分。也就是說,在內存中預留了一定的存儲空間,用來暫時保存輸入或輸出的數據,這部分預留的空間就叫做緩沖區。
緩沖區根據其對應的是輸入設備還是輸出設備,分為輸入緩沖區和輸出緩沖區。
⑥ C語言里如何設置緩沖區,
很簡單的定義一個數組,用兩個變數下標來指向頭和尾,新數據來尾++ 老數據處理完頭++ 兩個下標超過界限時從頭開始循環利用 中間要考慮緩存數據空和數據滿的情況
或者你動態分配空間,來一個信號分配空間,插入隊列鏈表,處理完一個出隊列,釋放空間
⑦ c語言 強制把輸入緩沖區的內容列印出來,輸出到標准設備上!!!
#include<stdio.h>
intmain()
{
charc,c1[100];
setbuf(stdin,c1);//把緩沖區設置成c1
scanf("%c",&c);
printf("c:%c c1:%s ",c,c1);
return0;
}
標准緩沖區實在是找不到怎麼搞,弄個數組做個臨時緩存吧
⑧ 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語言,scanf函數,在輸入一個數據時,如何使數據進去緩沖區
關於清空緩沖區,舉例如下:
#include<stdio.h>
intmain()
{
intx;
scanf("%d",&x);
fflush(stdin);//清空輸入緩沖
scanf("%d",&x);//清空緩沖區後繼續輸入
printf("%d ",x);
return0;
}