c讀寫緩存
1. c語言的輸入緩沖怎麼回事,哪裡有詳細介紹啊
緩沖是標准C中的標准I/O里的機制,標准庫里的I/O語句為了提高讀寫的效率,在實際讀寫之前將數據保存到一段內存中,這段內存就叫緩沖,分全緩沖,行緩沖兩種,全緩沖在緩沖的內存滿了之後做實際的讀寫,行緩沖在遇到換行符之後做實際的讀寫,unix高級環境編程里第五章里有詳細的說明,或者網路也有
2. 如何用C語言讀寫單片機的數據緩沖器SBUF
直接賦值給變數就可以了。比如:
unsigned char getdat;
void uart() interrupt 4
{
if(RI)
{
RI=0;
getdat=SBUF;
}
}
3. C在文件讀寫完畢後不使用fflush(fp)清空指針緩存有什麼後果。
fflush(fp)是將文件緩存中的數據刷到磁碟
如果不執行fflush,則如果操作系統崩潰或者主機掉電,你通過fp寫的內容有可能會丟失。
4. c語言中多線程讀寫同一個環形緩沖區的實現
#include <stdio.h>
#include <windows.h>
#include <process.h>
unsigned __stdcall ThreadWrite(void* param);
unsigned __stdcall ThreadRead(void* param);
int WriteSeque = 0;
int ReadSeque = 0;
int RingBuf[4];
void main()
{
HANDLE htw = (HANDLE)_beginthreadex(NULL, 0, ThreadWrite, NULL, 0, 0);
HANDLE htr = (HANDLE)_beginthreadex(NULL, 0, ThreadRead, NULL, 0, 0);
CloseHandle(htw);
CloseHandle(htr);
while (1)
{
if (WriteSeque >= 100)
{
break;
}
}
printf("Quit\n");
}
unsigned __stdcall ThreadWrite(void* param)
{
int i = 0;
while (1)
{
if (WriteSeque >= ReadSeque && WriteSeque- ReadSeque < 4)
{
RingBuf[WriteSeque%4] = i;
printf("Write:%d\n", i);
i++;
WriteSeque++;
Sleep(50);
}
}
}
unsigned __stdcall ThreadRead(void* param)
{
while (1)
{
if (ReadSeque < WriteSeque)
{
printf("Read:%d\n", RingBuf[ReadSeque%4]);
ReadSeque++;
Sleep(100);
}
}
}
為了讓你看到效果,讀寫線程的休眠時間略有不同。
5. c 語言如何提取緩存中的數據
這個可以參考Linux內部函數
每一個C語言的使用到緩沖區的函數基本在Linux內核都有對應的函數,比如printf在Linux內部為printk,而對於緩沖區的提取和讀寫,都會涉及到Linux內核的部分代碼
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語言中,什麼是緩沖文件系統和文件緩沖區
目前c語言使用的文件系統分為緩沖文件系統(標准i
/
o)和非緩沖文件系統(系統i
/
o)。緩沖文件系統的特點是:在內存開辟一個「緩沖區」,為程序中的每一個文件使用,當執
行讀文件的操作時,從磁碟文件將數據先讀入內存「緩沖區」,裝滿後再從內存「緩沖區」依此讀入接收的變數。執行寫文件的操作時,先將數據寫入內存「緩沖區」,待內存「緩沖區」裝滿後再寫入文件。
因此當程序運行時雖然進行了寫數據操作,但是如果寫入的數據沒有裝滿內存中的緩沖區,就不會將數據寫入到磁碟文件中。當程序運行結束後,系統就會將緩沖區中的數據寫入到磁碟上的文件中,因此就可以看到文件中的內容。
常用的fopen命令就會使用文件讀寫緩沖區,fclose命令關閉文件,把緩沖區中的內容寫入磁碟上的文件中。詳見:
http://study.qqcf.com/web/171/19812.htm
8. C語言 緩存文件讀取代碼問題
這里的num表示文件中有效數據的個數。
如果num == -1,那麼for循環讀取文件數據的條件就不會滿足,也就是說,如果過num < 0,for循環就不會執行。
9. C++怎麼緩存讀寫文件
可以先在內存中開一個buf
大小和你要寫的文件大小相等
先將處理後的數據寫入buf, 然後一次性寫入文件。
如果文件過大,比如幾百兆的話,可以開一個比較小的buffer,10MB或者100MB,看你電腦資源。
處理一部分,寫入一部分。
10. 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);