花了點時間把園子弄得好看了點,現在繼續。
函數名: putc
功 能: 輸出一字符到指定流中
用 法: int putc(int ch, FILE *stream);
_putc_lk(_c,_stream) (--(_stream)->_cnt >= 0 ? 0xff & (*(_stream)->_ptr++ = (char)(_c)) : _flsbuf((_c),(_stream)))
看到這個宏是否覺得很熟悉,很像getc的宏吧。
那麼,很容易產生一個問題,同樣是改變IO控制塊中的信息,同時使用putc和getc能否正常地進行讀寫操作呢?
使用一個簡單的樣例測試了一下:
#include <stdio.h> main( i = FILE *fp = fopen(, a = putc( putc( putc( putc( }
以上這段代碼未能正常在input.txt文件中寫入內容。
通過單步調試可以看到,getc是成功的,putc也是改變了緩沖區的,但是在寫入文件這一步出了問題。
更進一步,比較了在fopen後,先進行getc和先進行putc,fp的各成員的值的異同。可以看到,當先進行getc時,fp->_flag=137,而當先進行putc時,fp->_flag=138。那麼,顯然在第一次使用函數讀寫fp時,就會為fp定下不同的讀寫標記。該標記會阻止其他類型的操作。
於是,在上述代碼的第8行下加入代碼:fp->_flag = 138後,putc成功。
從緩沖區的意義來說,不會說不允許同時支持讀寫。原因可能是同時讀寫文件在是實際意義上會造成讀信息或寫信息的混亂,亦或者可能是實現上的原因。猜測。
言歸正傳:
那麼putc只有在FILE中為寫信息的時候才生效。
當stream->_cnt大於0(緩沖區還有寫空位),就繼續寫,如果沒有空位了就調用_flsbuf((_c),(_stream)),通過該函數調用WriteFile,將緩沖區中的內容寫入到文件中,然後重置_ptr的位置和_cnt的大小。
簡單的邏輯。
完