C 的檔案操作

2021-07-24 10:38:37 字數 3910 閱讀 6230

很多人在c++程式設計中習慣使用ansi c下的檔案型別指標file來執行檔案的有關操作,這難免影響c++程式的總體美觀性。另外,c++標準io庫中提供了更為完善、易用的檔案操作方法,所以建議使用標準庫來實現檔案的輸入/輸出,培養一種好的程式設計習慣。

1.檔案的輸入輸出

檔案操作的標頭檔案有:ifstream提供檔案讀取功能;ofstream提供檔案寫入功能;fstream提供檔案的讀寫功能(包括了前兩類的功能,實現對同一檔案的讀寫雙操作)。 

a.定義物件

ifstream infile; //

定義輸入物件

ofstream outfile; //

定義輸出物件

b.在使用fstream物件之前,還必須使這些物件繫結要讀寫的檔案

infile.open ("

in.txt

"); //

要輸入in.txt檔案

outfile.open ("

out.txt

"); //

要輸出out.txt檔案

當然,fstream類提供了建構函式,可以在定義物件時初始化實現上述兩步

ifstream infile ("

in.txt

"); //

定義infile物件,輸入in.txt檔案內容

ofstream outfile ("

out.txt

"); //

定義outfile物件,輸出內容到out.txt檔案

c.檢查檔案開啟是否成功

if (!infile)

d.檔案內容的處理 

i.成員函式eof()用來檢測是否到達檔案尾,如果到達檔案尾返回非0值,否則返回0

//

輸入檔案,進行處理時使用

if (!infile.eof())

ii.檔案分為文字檔案和二進位制檔案,對文字檔案的處理比較簡單,用插入器和析取器就可以了;而對於二進位制的處理要複雜些,下要分別介紹這兩種方式 

文字檔案:

用插入器(<<)向檔案輸出;用析取器(>>)從檔案輸入。假設infile以輸入方式開啟,outfile以輸出開啟 

outfile<<"

向檔案輸出";

string

word;

infile>>word; //

檔案內容輸入到word,word是檔案中某個字串

這種方式還有一種簡單的格式化能力,比如可以指定輸出為16進製制等等

操縱符功能

輸入/輸出

dec格式化為十進位制數值資料

輸入和輸出

hex格式化為十六進製制數值資料

輸入和輸出

oct格式化為八進位制數值資料

輸入和輸出

setpxecision(int p)

設定浮點數的精度位數

輸出endl

輸出乙個換行符並重新整理此流

輸出ends

輸出乙個空字元輸出

比如要把123當作十六進製制輸出:outfile<

istream& getline (istream& is, string& str, char

delim);

istream& getline (istream& is, string& str);

從 is 中讀取字串存入 str 中,直到遇到分隔符delim為止。對於第二種形式,getline遇到 '\n』 停止。執行過程中,如果delim出現,它會被讀取並丟棄,下次輸入將在它之後開始。 

二進位制檔案:

put()函式向流寫入乙個字元,其原型是ofstream &put(char ch),使用也比較簡單,如outfile.put('c');就是向流寫乙個字元'c'。 

get()函式比較靈活,有3種常用的過載形式: 

一種就是和put()對應的形式:ifstream &get(char &ch);功能是從流中讀取乙個字元,結果儲存在引用ch中,如果到檔案尾,返回空字元。如infile.get(x);表示從檔案中讀取乙個字元,並把讀取的字元儲存在x中。 

另一種過載形式的原型是: int get();這種形式是從流中返回乙個字元,如果到達檔案尾,返回eof,如x=file2.get();和上例功能是一樣的。 

還有一種形式的原型是:ifstream &get(char *buf,int num,char delim=' ');這種形式把字元讀入由 buf 指向的陣列,直到讀入了 num 個字元或遇到了由 delim 指定的字元,如果沒使用 delim 這個引數,將使用預設值換行符' '。 

讀寫二進位制資料塊,要使用成員函式read()和write()成員函式,它們原型如下:

read (unsigned char *buf, int

num);

write (

const unsigned char *buf, int num);

iii.檔案的定位,c++的檔案定位分為讀位置和寫位置的定位,對應的成員函式是 seekg()和 seekp(),seekg()是設定讀位置,seekp是設定寫位置。它們最通用的形式如下:

istream &seekg (streamoff offset, seek_dir origin);

ostream &seekp (streamoff offset, seek_dir origin);

offset定義了偏移量,seek_dir 表示移動的基準位置,是乙個有以下值的列舉: 

ios::beg: 檔案開頭 

ios::cur: 檔案當前位置 

ios::end: 檔案結尾 

這兩個函式一般用於二進位制檔案(位元組),因為文字檔案會因為系統對字元的解釋而可能與預想的值不同。

file1.seekg (1234,ios::cur); //

把檔案的讀指標從當前位置向後移1234個位元組

file2.seekp (1234,ios::beg); //

把檔案的寫指標從檔案開頭向後移1234個位元組

e.檔案關閉 

程式結束或fstream物件與另一檔案關聯時,必須先關閉現在的檔案。

infile.close(); //

關閉infile檔案

2.檔案模式

在開啟檔案時,無論是呼叫open還是以檔名作為流初始化的一部分,都需要指定檔案模式。檔案流建構函式和open函式都提供了預設引數來設定檔案模式,預設值因流型別的不同而不同。常用的檔案模式與含義如下:

檔案模式

含義in

開啟檔案作讀操作

out開啟檔案作寫操作

在每次寫之前找到檔案尾

ate開啟檔案時把檔案定位在檔案尾

trunc

開啟檔案時清空已存在的檔案流

binary

以二進位制模式進行io操作

以binary模式開啟的流將檔案以位元組序列的形式處理,而不解釋流中的字元。 

預設情況下,與ifstream流對相關聯的檔案以in模式開啟,與ofstream關聯檔案以out模式開啟。以out模式開啟的檔案會被清空,丟棄該檔案儲存的所有資料,從效果來看,為ofstream物件指定out模式等效於指定了out和trunc模式。 

模式的組合,多個檔案模式可以同時指定,但是有些組合是沒有意義的,常見的組合模式如下

組合模式

含義開啟檔案做寫操作,檔案尾寫入

out | trunc

開啟檔案做寫操作,刪除檔案已有資料(與out相同)

in | out

開啟檔案做讀、寫操作,定位到檔案開頭處

in | out | trunc

開啟檔案做讀、寫操作,刪除檔案中已有資料

in | out | ate

開啟檔案做讀、寫操作,定位到檔案末尾處

…………

C 檔案操作與C 的檔案操作

c filestream 檔案流 主要用於使用二進位制方式讀寫檔案資料,可讀取任何檔案 建立filestream物件 e 建立filestream物件 filemode 指定系統開啟檔案的方式filestream fileaccess 指定檔案的訪問方式 read唯讀,write只寫,readwri...

C 檔案的操作

在c 中,有乙個stream這個類,所有的i o都以這個 流 類為基礎的,包括我們要認識的檔案i o,stream這個類有兩個重要的運算子 1 插入器 向流輸出資料。比如說系統有乙個預設的標準輸出流 cout 一般情況下就是指的顯示器,所以,cout write stdout n 就表示把字串 wr...

C 檔案的操作

3 執行讀寫操作 4 關閉閱讀器 寫入器 5 關閉檔案流 二 檔案和目錄的操作 2 目錄的操作 3.注意 三 總結 檔案的操作是最與我們相關的動作,但是這個動作如何讓 實現呢?在c 中需要操作檔案需要匯入命名空間 system.io,然後建立乙個檔案流。語法filestream strem new ...