二進制文件的IO操作

二進制文件的IO操作

習慣上,把非文本文件叫做二進制文件,實際上,所有的文件都是按照二進制存儲 的。文本文件中存放的大部分是可見字符,加

上少許控制字符;而二進制文件則可以包含任何字符和數據。二進制文件的輸入輸出不能用插入和提取操作符(<<和>>操作符)來

實現,因爲它們是爲文本文件準備的。 對於二進制文件,必須使用read()和write()函數來讀取和寫入。

創建一個二進制文件:ofstream fout("file.dat", ios::binary)

將一個整數寫入文件:int number = 30;  fout.write((char *)(&number), sizeof(number))

使用二進制文件的好處是可以一次把一個結構寫入文件,大大提高了數據的存儲效率,而如果使用的是文本文件存儲結構,你就

不得不打結構的數據成員一個一個地寫入文件。

讀取二進制文件的內容: ifstream fin("file.dat", ios::binary);  fin.read((char *)(&obj), sizeof(obj));

默認地,文件以ASCII方式打開,不存在則創建,存在就覆蓋。

一些標誌:

ios::app   添加到文件尾

ios::ate    把文件標誌放在末尾而非起始

ios::trunc  默認,截斷並覆寫文件

ios::nocreate    文件不存在也不創建

ios::noreplace   文件存在則失敗

ios::binary  以二進制形式打開文件

一個重要的類:ios_base

ios_base是C++標準程序庫中的一個類,定義於<ios>頭文件中。ios_base類封裝了C++標準中的流輸入輸出中不依賴於讀寫的

數據的類型的基本信息,如格式化信息、異常狀態、事件回調函數等。

C++程序設計時,一般不會直接調用std::ios_base的成員函數,但是會經常用到該類中定義的各種流的數據格式的枚舉值常

量。如ios_base::hex、ios_base::skipws等等。

在類std::ios_base中,保存了下述關於流的信息:

  • 格式控制信息的枚舉類型fmtflags ,影響到如何解釋輸入串行的格式、如何生成輸出串行的格式,例如整數是16進制還

         是10進製表示,浮點數是科學計數法還是定點形式等;

  • 流的狀態的枚舉類型iostate,如數據是否完整、是否到達流的末尾、是否讀寫失敗等;
  • 流的打開方式的枚舉類型openmode,如讀取、寫入、追加、創建時刪除原內容、二進制打開、
  • 流的定位位置的枚舉類型seekdir,如開始位置、當前位置、結尾位置等。
  • 流的事件的枚舉類型event,如“擦除”事件erase_event,改變locale設置事件imbue_event,複製格式事件   copyfmt_event。
  • 流的私用的其它額外保存的數據,爲一個long型數組與一個指針數組。
  • 一個成員類failure,用於作爲C++標準中的流輸入輸出類庫拋出的各種異常的基類。
  • 一個成員類Init,用於封裝cout、cin、wcout等8個靜態對象的初始化函數。

ios 和ios_base 有什麼不同?

ios是basic_ios的模板實現,而basic_ios繼承了ios_base, 所以經常有這樣的寫法 ios::in, ios_base::in 其實效果是一樣的。

 

發佈了37 篇原創文章 · 獲贊 16 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章