關於檔案的操作,屬於c++的io
類範疇。
一、在c++中,對檔案的操作是通過stream的子類fstream(file stream)來實現的,就必須加入標頭檔案fstream.h。
#include
using
namespace
std;
二、開啟檔案
在fstream類中,有乙個成員函式open(),就是用來開啟檔案的,其原型是:
void open(const char* filename, int mode, int access);
引數:filename
: 開啟的檔名
mode
: 開啟檔案的方式
access
: 開啟檔案的屬性
開啟檔案的方式
:在類ios(是所有流式i/o類的基類)中定義,常用的值如下:
ios::binary: 以二進位制
方式開啟檔案,預設的方式是文字方式。兩種方式的區別見前文
ios::in: 檔案以輸入方式開啟
ios::out: 檔案以輸出方式開啟
ios::nocreate: 不建立檔案,所以檔案不存在時開啟失敗
ios::noreplace:不覆蓋檔案,所以開啟檔案時如果檔案存在失敗
ios::trunc: 如果檔案存在,把檔案長度設為0
可以用「或」把以上屬性連線起來,如ios::out|ios::binary
開啟檔案的屬性:0
:普通檔案,開啟訪問
1:唯讀檔案
2:隱含檔案
4:系統檔案
可以用「或」或者「+」把以上屬性連線起來 ,如3或1|2就是以唯讀和隱含屬性開啟檔案。
舉例:以二進位制輸入方式開啟檔案c盤下的config.sys檔案:
fstream file1;
file1.open(
"c:\\config.sys"
, ios::binary |ios::in, 0);
或者 file1.open(
"c:/config.sys"
, ios::binary |ios::in, 0);
如果open函式只有檔名乙個引數,則是以讀/寫普通檔案開啟:
file1.open("c:/config.sys");<=>file1.open("c:/config.sys",ios::in|ios::out,0);
對於fstream的建構函式具有和open函式一樣的作用,在定義的時侯可以可以開啟檔案
:fstream file1("c:/config.sys");
注:fstream有兩個子類:ifstream(inputfile stream)和ofstream(outpufile stream),
ifstream預設以輸入方式開啟檔案,而ofstream預設以輸出方式開啟檔案。
ifstream file2("c:/pdos.def");//
以輸入方式開啟檔案
ofstream file3("c:/x.123"); //以輸出方式開啟檔案
可以視情況選擇需要的開啟方式!!!
三、關閉檔案
開啟的檔案使用完成後一定要關閉,fstream
提供了成員函式close()來完成此操作,如:file1.close();
就把file1相連的檔案關閉。
四、讀寫檔案
讀寫檔案分為文字檔案和二進位制
檔案的讀寫
,對於文字檔案的讀寫
比較簡單,用插入器(<<)
和析取器(>>)就可以了:
1、文字檔案的讀寫
① 文字檔案的讀寫很簡單:用插入器(<<)向檔案輸出;用析取器(>>)從檔案輸入。
舉例:file1
是以輸入方式開啟,file2以輸出開啟。
file2<<"ilove you";//
向檔案寫入字串"i love you"
int i;
file1>>i;//從檔案輸入乙個整數值。
這種方式還有一種簡單的格式化能力,比如可以指定輸出為16進製制等等,具體的格式有以下一些:
操縱符 功能 輸入/輸出
dec
格式化為十進位制數值資料 輸入和輸出
endl
輸出乙個換行符並重新整理此流 輸出
ends
輸出乙個空字元 輸出
hex
格式化為十六進製制數值資料 輸入和輸出
oct
格式化為八進位制數值資料 輸入和輸出
setpxecision(int p)
設定浮點數的精度位數 輸出
② 文字檔案的獲取一行的操作是:
istream &getline( char *buffer, streamsize num );
用getline()讀取字元到buffer中,buffer在**中通常體現為乙個字元陣列,streamsize num
是一次讀入多少個
字元, num - 1個字元已經讀入。
istream &getline( char *buffer, streamsize num, char delim );
當碰到乙個換行標誌, 碰到乙個eof, 或者任意地讀入,直到讀到字元delim。delim字元不會
被放入buffer中。
delim字元可以自已設定,預設為回車符'/n' 。
2、二進位制
檔案的讀寫
讀寫字元
put()
put()
函式向流寫入乙個字元,其原型是ofstream&put(char ch),使用也比較簡單,如file1.put('c');就是
向流寫乙個字元'c'。
get()
get()函式比較靈活,有3種常用的過載形式:
一種就是和put()對應的形式:ifstream&get(char &ch);功能是從流中讀取乙個字元,結果儲存在引用ch中,
如果到檔案尾,返回空字元。如file2.get(x);表示從檔案中讀取乙個字元,並把讀取的字元儲存在x中。
另一種過載形式的原型是: int get();這種形式是從流中返回乙個字元,如果到達檔案尾,返回eof,
如,x=file2.get();和上例功能是一樣的。
還有一種形式的原型是:ifstream &get(char *buf,int num,char delim=' ');這種形式把字元讀入由 buf
指向的陣列,直到讀入了 num 個字元或遇到了由 delim 指定的字元,如果沒使用 delim 這個引數,將使用
預設值換行符' '。例如: file2.get(str1,127,'a');//從檔案中讀取字元到字串str1,當遇到字元'a'或讀取
了127個字元時終止。
讀寫資料塊
要讀寫二進位制
資料塊,使用成員函式read()和write()成員函式,它們原型如下:
read(unsigned char *buf,int num);
write(const unsigned char *buf,int num);
read()從檔案中讀取
num 個字元到 buf 指向的快取中,如果在還未讀入 num 個字元時就到了檔案尾,
可以用成員函式int gcount();來取得實際讀取
的字元數;而 write() 從buf 指向的快取寫 num 個字元到
檔案中,值得注意的是快取的型別是unsigned char *,有時可能需要型別轉換。
例:unsigned charstr1="i love you";
int n[5];
ifstream in("***.***");
ofstream out("yyy.yyy");
out.write(str1,strlen(str1));//把字串str1全部寫到yyy.yyy中
in.read((unsigned char*)n,sizeof(n));//從***.***中
讀取
指定個整數,注意型別轉換
in.close();out.close();
C 檔案操作詳解 fstream
c 中對檔案操作需要包含標頭檔案fstream 操作檔案三大類 ofstream 寫操作 ifstream 讀操作 fstream 讀寫操作 寫檔案 主要步驟 包含標頭檔案 include 2.建立流物件 ofstream ofs 3.開啟檔案 ofs.open 檔案路徑 開啟方式 4.寫資料 of...
C 流操作之fstream
在windows平台對檔案進行訪問操作可選的方案有很多,如果採用純c,則需要用到file 等,當然也可以直接呼叫windows api來做 如果採用c 首先想到的就是檔案流fstream。雖然在com層面上,我們還可以使用istream來實現檔案的讀寫,其效率也非常高。不過本文僅對c 流操作做簡單的...
C 的FSTREAM類提供的檔案操作
c c 檔案操作 二 c 的fstream類提供的檔案操作 在c 中,有乙個stream這個類,所有的i o都以這個 流 類為基礎的,包括我們要認識的檔案 i o,stream這個類有兩個重要的運算子 1 插入器 向流輸出資料。比如說系統有乙個預設的標準輸出流 cout 一般情況下就是指的顯示器,所...