當我們要設定檔案位置為給定流 stream 的檔案的開頭時,其實我們有兩種選擇,
直接呼叫rewind
函式,
rewind(fp);
或者使用fseek
fseek(fp,0l,seek_set);
那麼這兩者有什麼區別呢?我們從介面本身的使用和實現兩個反面來說。
首先,從介面本身來說,rewind
是沒有返回值的,看下邊的示例**,這段**會有乙個問題,那就是一旦rewind
失敗程式應該如何處理呢?
#include
int main (
)
如果我們換成使用,fseek
則**會變成大約下邊的樣子,
#include
int main (
)else..
.}
因此,從錯誤處理的角度來說,大多數情況下應該選擇使用fseek
.
我們再來看看介面的實現,當然iso c中只是定義了介面,不會對介面的實現做具體規定,因此如何實現乙個介面很大程度上取決於c執行庫,這有很多如bsd libc,glibc,microsoft c run-time library 等等。。。,但是從**設計的角度來看rewind
應該要直接呼叫fseek
比較好,或者至少兩者應該是同源的,這樣比較科學,也沒有理由不這麼做。下邊我們看一下glibc的源**裡是怎麼處理的,
首先看rewind
,函式的定義位於檔案 \glibc\libio\rewind.c中,
#include
"libiop.h"
#include
void
rewind (file *fp)
上邊**中的_io_rewind
是乙個巨集,在檔案libio\iolibio.h中定義,好了rewind
先看到此處
#define _io_rewind(file) \
(void) _io_seekoff_unlocked (file, 0, 0, _ios_input|_ios_output)
fseek
的定義在檔案libio\fseek.c中,
int fseek (file *fp,
long
int offset,
int whence)
同樣_io_fseek
也是乙個巨集,
#define _io_rewind(file) \
#define _io_fseek(__fp, __offset, __whence) \
(_io_seekoff_unlocked (__fp, __offset, __whence, _ios_input|_ios_output) \
== _io_pos_bad ? eof : 0)
看到這裡我們已經比較了解了,在glibc中rewind
和fseek
本質上都是呼叫了函式_io_seekoff_unlocked
,所以兩者是同根同源的,在不考慮返回值的情況下呼叫哪個都可以,用rewind
寫起來簡單些,用fseek
呢,以後對於錯誤處理的擴充套件性會好一點。 fseek讀,到底有多快!
常聽人說,fseek很快 到底多快?如果不知道多快,就乙個勁的爭論很快!好像不必擔心的快一樣。這種常識性的東西不知道,妄談系統設計,就會出笑話的。下面做個實驗,測測fseek的量級。測試的方法 1.乙個檔案512m 2.乙個執行緒對應乙個檔案,然後在這個檔案裡邊進行rand fseek,然後讀1k位...
到底有多二
7 3 到底有多二 15 分 乙個整數 犯二的程度 定義為該數字中包含2的個數與其位數的比值。如果這個數是負數,則程度增加0.5倍 如果還是個偶數,則再增加1倍。例如數字 13142223336是個11位數,其中有3個2,並且是負數,也是偶數,則它的犯二程度計算為 3 11 1.5 2 100 約為...
到底有多少記憶體
在虛擬記憶體模型下,理論上有 2gb的記憶體供程式使用。當 virtualalloc 或者其他函式提交虛擬記憶體時,虛擬記憶體管理器就開始消耗 ram。當物理記憶體將被消耗完時,管理器就開始將記憶體頁面對映到硬碟。在預設的設定下,作業系統會用硬碟的所有可用空間來作為磁碟交換檔案。因此,記憶體的限制並...