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

2022-05-04 20:24:10 字數 1566 閱讀 4802

如果進行二進位制i/o操作,那麼我們更願意一次讀或寫整個結構。因此,提供了下列兩個函式以執行二進位制i/o操作。

#include size_t fread( 

void *restrict ptr, size_t size, size_t nobj, file *restrict fp );

size_t fwrite(

const

void *restrict ptr, size_t size, size_t nobj, file *restrict fp );

兩個函式的返回值:讀或寫的物件數

這些函式有兩種常見的用法:

(1)讀或寫乙個二進位制陣列。例如,為了將乙個浮點陣列的第2-5個元素寫至乙個檔案上,可以編寫如下程式:

float    data[10

];if( fwrite( &data[2], sizeof(float), 4, fp ) != 4

) err_sys(

"fwrite error

" );

其中,指定size為每個陣列元素的長度,nobj為欲寫的元素數。

(2)讀或寫乙個結構。例如,可以編寫如下程式:

struct

item;

if( fwrite( &item, sizeof(item), 1, fp ) != 1

) err_sys(

"fwrite error

" );

其中,指定size為結構的長度,nobj為1(要寫的物件數)。

將這兩個例子結合起來就可讀或寫乙個結構陣列。為了做到這一點,size應當是該結構的sizeof,nobj應是該陣列中的元素個數。

fread和fwrite返回讀或寫的物件數。對於讀,如果出錯或到達檔案尾端,則此數字可以少於nobj。在這種情況下,應呼叫ferror或feof以判斷究竟屬於哪一種情況。對於寫,如果返回值少於所要求的nobj,則出錯。

使用二進位制i/o的基本問題是,它只能用於讀在同一系統上已寫的資料。多年之前,這並無問題(那時,所有的unix系統都執行於pdp-11上),而現在,很多異構系統通過網路相互連線起來,而且,這種情況已經非常普遍。常常有這種情形,在乙個系統上寫的資料,要在另乙個系統上進行處理。在這種環境下,這兩個函式可能就不能正常工作,其原因是:

(1)在乙個結構中,同一成員的偏移量可能因編譯器和系統而異(由於不同的對準要求)。確實,某些編譯器有乙個選項,選擇它的不同值,或者使結構中的各成員緊密包裝(這可以節省儲存空間,而執行效能則可能有所下降);或者準確對齊(以便在執行時易於訪問結構中的各成員)。這意味著即使在同乙個系統上,乙個結構的二進位制存放方式也可能因編譯器選項的不同而不同。

(2)用來儲存多位元組整數和浮點值的二進位制格式在不同的機器體系結構間也可能不同。

在不同系統之間交換二進位制資料的實際解決方法是使用較高階的協議(例如網路協議)。

本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:

二進位制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...

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

把資料寫入到檔案效率最高的方法是用二進位制形式寫入。二進位制輸出避免了在 數值轉換為字串過程中涉及的開銷和精度損失。fread函式用於讀取二進位制資料,fwrite用於寫入二進位制資料。size t fread void buffer,size t size,size t count,file st...

二進位制 二進位制起源

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