C 之檔案IO操作流

2021-06-02 16:29:03 字數 3691 閱讀 3363

檔案指存放在外部介質上的資料的集合。大家都知道作業系統是以檔案為單位來對資料進行管理的。因此如果你要查詢外部介質的資料,則先要按檔名找到指定檔案,然後再從檔案中讀取資料,如果要把資料存入外部介質中,如果沒有該檔案,則先要建立檔案,再向它輸入資料。由於檔案的內容千變萬化,大小各不相同,為了統一處理,在c++中用檔案流的形式來處理,檔案流是以外存檔案為輸入輸出物件的資料流。輸出檔案流表示從記憶體流向外存檔案的資料,輸入檔案流則相反。根據檔案中資料的組織形式,

檔案可分為兩類:文字檔案和二進位制檔案。文字檔案又稱為ascii檔案,它的每個位元組存放乙個ascii碼,代表乙個字元。二進位制檔案則是把記憶體中的資料,按照其在記憶體中的儲存形式原樣寫在磁碟上存放。比如乙個整數20000,在記憶體中在兩個位元組,而按文字形式輸出則佔5個位元組。因此在以文字形式輸出時,乙個位元組對應乙個字元,因而便於字元的輸出,缺點則是占用儲存空間較多。

用二進位制形式輸出資料,節省了轉化時間和儲存空間,但不能直接以字元的形式輸出。

1.在c++中對檔案進行操作分為以下幾個步驟:(1)建立檔案流物件;(2)開啟或建立檔案;(3)進行讀寫操作;(4)關閉檔案;用於檔案io操作的流類主要有三個fstream(輸入輸出檔案流),ifstream(輸入檔案流)和ofstream(輸出檔案流);而這三個類都包含在標頭檔案fstream中,所以程式中對檔案進行操作必須包含該標頭檔案。首先建立流物件,然後使用檔案流類的成員函式open開啟檔案,即把檔案流物件和指定的磁碟檔案建立關聯。成員函式open的一般形式為:

檔案流物件.open(檔名,使用方式);

其中檔名可以包括路徑(如:e:\c++\file.txt),如果缺少路徑,則預設為當前目錄。使用方式則是指檔案將被如何開啟。以下就是檔案的部分使用方式,都是ios基類中的列舉型別的值:

此外開啟方式有幾個注意點:

(1)因為nocreate和noreplace,與系統平台相關密切,所以在c++標準中去掉了對它的支援。

(2)每乙個開啟的檔案都有乙個檔案指標,指標的開始位置由開啟方式指定,每次讀寫都從檔案指標的當前位置開始。每讀乙個位元組,指標就後移乙個位元組。當檔案指標移到最後,會遇到檔案結束符eof,此時流物件的成員函式eof的值為非0值,表示檔案結束。

(3)用in方式開啟檔案只能用於輸入資料,而且該檔案必須已經存在。

(5)用ate方式開啟乙個已存在的檔案,檔案指標自動移到檔案末尾,資料可以寫入到其中。

如果檔案需要用兩種或多種方式開啟,則用"|"來分隔組合在一起。除了用open成員函式開啟檔案,還可以用檔案流類的建構函式來開啟檔案,其引數和預設值與open函式完全相同。比如:檔案流類 stream(檔名,使用方法);如果檔案開啟操作失敗,open函式的返回值為0,用建構函式開啟的話,流物件的值為0。所以無論用哪一種方式開啟檔案,都需要在程式中測試檔案是否成功開啟。

在每次對檔案io操作結束後,都需要把檔案關閉,那麼就需要用到檔案流類的成員函式close,一般呼叫形式:流物件.close();關閉實際上就是檔案流物件和磁碟檔案失去關聯。

2.介紹完檔案的開啟和關閉,接下來說說檔案的讀寫。我將分別從文字檔案讀寫和二進位制檔案的讀寫來介紹。其實檔案的讀寫是十分容易的。流類庫中的io操作<<、>>、put、get、getline、read和write都可以用於檔案的輸入輸出。

寫檔案:

#include "stdafx.h"

#include #include int main()

sprite(std::string profession,std::string weapon):profession(profession),weapon(weapon)

{}void showsprite();//顯示精靈資訊

};int sprite::count=0;

void sprite::showsprite();

//開啟檔案

std::ofstream file("file.dat",std::ios::ate|std::ios::binary);

if(!file)

//寫檔案

for(int i=0;i<3;i++)

file.write((char*) &sprites[i],sizeof(sprites[i]));

//關閉檔案

file.close();

return0;

}

讀檔案file.dat:

#include "stdafx.h"

#include #include #include int main()

//讀檔案

for(int i=0;i<3;i++)

//關閉檔案

rfile.close();

return0;

}

讀出顯示字元:

在read函式還是write函式裡都要把資料轉化為char*型別,**中sizeof函式是用於確定要讀入讀出的位元組數。

在檔案結束處有個標誌位eof,在用檔案流讀取檔案時,使用成員函式eof()(函式原型:int eof())可以檢測到結束符。如果該函式返回值為非零,則表示到達檔案末尾。返回零則表示未達到檔案末尾。

(3)前面所介紹的檔案都是按順序來讀取的的,c++中又提供了針對於檔案讀寫指標的相關成員函式,使得我們可以在io流中隨意移動檔案指標,從而對檔案的進行隨機地讀寫。類istream針對讀指標提供3個成員函式:

tellg()//返回輸入檔案讀指標的當前位置;

seekg(檔案中的位置)//將輸入檔案中的讀指標移動到指定位置

seekg(位移量,參照位置)//以參照位置為基準移動若干位元組

其中參照位置是列舉值:

beg//從檔案開頭計算要移動的位元組數

cur//從檔案指標的當前位置計算要移動的位元組數

end//從檔案的末尾計算要移動的位元組數

如果參照位置省略,則預設為beg.而類ostream針對寫指標提供的3個成員函式:

tellp()//返回輸出檔案寫指標的當前位置;

seekp(檔案中的位置)//將輸出檔案中的寫指標移動到指定位置

seekp(位移量,參照位置)//以參照位置為基準移動若干位元組

#include "stdafx.h"

#include #include #include int main()

//讀檔案

for(int i=0;i<3;i++)

sprite rsprite;//建立物件

std::cout<<"改變讀取順序:"<******************************===

補充:open函式的引數定義了檔案的開啟模式。總共有如下模式

屬性列表

ios::in 讀

ios::out 寫

ios::binary 二進位制模式

ios::nocreate 開啟乙個檔案時,如果檔案不存在,不建立檔案。

ios::noreplace 開啟乙個檔案時,如果檔案不存在,建立該檔案

ios::trunc 開啟乙個檔案,然後清空內容

ios::ate 開啟乙個檔案時,將位置移動到檔案尾

notes

預設模式是文字

預設如果檔案不存在,那麼建立乙個新的

多種模式可以混合,用|(按位或)

檔案的byte索引從0開始。(就像陣列一樣)

我們也可以呼叫read函式和write函式來讀寫檔案。

檔案指標位置在c++中的用法:

ios::beg 檔案頭

ios::end 檔案尾

ios::cur 當前位置

IO流檔案操作

file f new file string pathname 完整目錄 file f new file string parent,string child 父目錄 加 子目錄 file f new file file parent,string child 父目錄 加 子 操作方法 boolea...

C 流之標準I O流

標準i o流是指對標準輸入裝置 鍵盤 滑鼠等 和標準輸出裝置 顯示器 印表機等 進行輸入輸出的過程。在根基類ios類中定義了3個使用者會經常使用的列舉型別,由於他們是在公用成員部分定義的,所以其中的每個列舉型別常量在加上ios 字首後都可以為本類成員函式和所有外部函式訪問。enum 以下是上述列舉常...

c 檔案與流I O

重點是理解什麼是流!資料流是一串連續不斷的資料的集合,就象水管裡的水流,在水管的一端一點一點地供水,而在水管的另一端看到的是一股連續不斷的水流。資料寫入程式可以是一段 一段地向資料流管道中寫入資料,這些資料段會按先後順序形成乙個長的資料流。對資料讀取程式來說,看不到資料流在寫入時的分段情況,每次可以...