fseek與rewind到底有何區別

2021-10-09 14:26:32 字數 1804 閱讀 7611

當我們要設定檔案位置為給定流 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中rewindfseek本質上都是呼叫了函式_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。當物理記憶體將被消耗完時,管理器就開始將記憶體頁面對映到硬碟。在預設的設定下,作業系統會用硬碟的所有可用空間來作為磁碟交換檔案。因此,記憶體的限制並...