二進位制I O 重新整理和定位函式

2022-05-28 11:03:12 字數 1905 閱讀 5068

把資料寫入到檔案效率最高的方法是用二進位制形式寫入。二進位制輸出避免了在 數值轉換為字串過程中涉及的開銷和精度損失。

fread函式用於讀取二進位制資料,fwrite用於寫入二進位制資料。 

size_t fread(void *buffer, size_t size, size_t count, file *stream);

size_t fwrite(

void *buffer, size_t size, size_t count, file *stream);

buffer是乙個指向用於儲存資料的記憶體位置的指標,size是緩衝區中每個元素的位元組數,count是讀取或寫入的元素數,stream是資料讀取或寫入的流。

函式返回值是實際讀取或寫入的元素(非位元組)數目。如果輸入遇到檔案尾或輸出出現錯誤,這個數字可能比請求的元素數要小。

有時候使用者程式希望把i/o緩衝區中的資料立刻傳給核心,讓核心寫回裝置,這稱為flush操作,對應的庫函式是fflush, fclose函式在關閉檔案之前也會做flush操作。

fflush它迫使乙個輸出流的緩衝區內的資料進行物理寫入,不管它是不是已經寫滿。 

int fflush(file *stream);

例如,呼叫fflush保證除錯資訊實際列印出來,而不是儲存在緩衝區直到以後才列印。

一般後面寫入的資料在檔案中的位置是以前所有寫入資料的後面。c同時支援隨機訪問i/o,通過在讀取或寫入先前定位到檔案中需要的位置來實現。

long ftell(file *stream);

int fseek(file *stream, long offset, int

from);

ftell函式返回流當前位置,也就是,下乙個讀取或寫入將要開始的位置距離起始位置的偏移量。在二進位製流中,這個值就是當前位置距離檔案其實位置之間的位元組數。

ftell的返回值總是可以用於fseek函式中,作為距離起始位置偏移量。

定位到檔案尾之後並進行寫入將擴充套件這個檔案。定位到檔案尾之後並進行讀取將導致返回一條「到達檔案尾」的訊息。在二進位制中,從seek_end進行定位可能不被支援。在文字流,如果from是seek_cur或seek_end,offset必須是零。如果from是seek_set,offset必須是乙個從同乙個流中以前呼叫ftell返回的值。

符號定位

seek_set

從流起始位置起offset個位元組,offset非負值。

seek_cur

從流當前位置起offset個位元組,offset可正可負。

seek_end

從流尾部位置起offset個位元組,offset可正可負。如果正只,定位到檔案尾的後面。

offset可正可負,負值表示向前(向檔案開頭的方向)移動,正值表示向後(向檔案末尾的方向)移動,如果向前移動的位元組數超過了檔案開頭則出錯返回,如果向後移動的位元組數超過了檔案末尾,再次寫入時將增大檔案尺寸,從原來的檔案末尾到fseek移動之後的讀寫位置之間的位元組都是0。

用fseek改變流的位置***:

1.行末指示字元被清除。

2.如果在fseek之前使用ungetc,那麼這個退回的字元會丟棄。

其他函式,限制更嚴: 

void rewind(file *stream);

int fgetpos(file *stream, fpos_t *position);

int fsetpos(file *stream, fpos_t const *position);

rewind函式將讀/寫指標設定回指定流的起始位置,同時清除流的錯誤提示標誌。

fgetpos和fsetpos分別是ftell和fseek的替代方案,fgetpos用乙個指向fpos_t的指標儲存檔案的當前位置,fsetpos把檔案位置設定為儲存在這個位置的值。

二進位制IO

把資料寫到檔案最有效率的方法就是利用二進位制形式寫入。size t fread void buffer,size t size,size t count,file stream size t fwrite void buffer,size t size,size t count,file strea...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

標準I O庫之二進位制I O

如果進行二進位制i o操作,那麼我們更願意一次讀或寫整個結構。因此,提供了下列兩個函式以執行二進位制i o操作。include size t fread void restrict ptr,size t size,size t nobj,file restrict fp size t fwrite ...