昨天簡單介紹了一下c中的檔案流操作,其實更強大、更複雜的操作還得看c++,畢竟c++是c的加強,不論是從功能還是效率上都比c高出乙個檔次,而我們在實際的流操作中對c++的使用怕也是更加頻繁,所以接下來就重點講解下c++的檔案流操作。
那麼就先說說檔案流的定義吧。檔案流是以外存檔案為輸入/輸出物件的資料流。輸出檔案流是從記憶體流向外存檔案的資料,輸入檔案流是從外存檔案流向記憶體的資料。每乙個檔案流都有乙個記憶體緩衝區與之對應。
與c一樣,c++的檔案流操作也分為同樣的三個部分。
(1)開啟檔案
(2)讀/寫檔案
(3)關閉檔案
在這之前先說下檔案流的類:
(1) ifstream ifile:只輸入用,它是從istream 類派生的。
(2) ofstream ofile:只輸出用,它是從ostream 類派生的。
(3) fstream iofile:既輸入又輸出用,它是從iostream 類派生的。
即是說,如果你想要的操作只是從檔案中讀資料,可這麼定義:
ifstream fin("...");
要寫入檔案,則是:
ofstream fout("...");
如果既有讀操作,又是寫操作,就可以直接定義:
fstream fin("...");
fstream fout("...");
好了,知道了這些就可以進行檔案的開啟操作了。
開啟檔案有兩種方式,一種是自動開啟,一種是呼叫open函式開啟。
(1)自動開啟:
fstream file("filename",iosmode);
(2)使用open函式開啟:
fstream file;
file.open("filename",iosmode);
也可以用指標的形式開啟:
fstream* file = new fstream;
file->open("filename",iosmode);
可以注意到,這裡的iosmode指的是開啟檔案的方式,和c一樣,c++中的檔案流操作中的檔案也是分成文字檔案和二進位制檔案,不光是檔案,開啟方式也有幾種型別,下面介紹的這些只是我們平時可能會用到的,當然還有很多態別,只是平時很難會用到,所以就不再介紹了。
ios::in 以輸入方式開啟檔案
ios::out 以輸出方式開啟檔案(預設方式)
ios::ate 開啟乙個存在檔案,檔案指標指向檔案尾
ios::binary 以二進位制方式開啟檔案
ios::in|ios::out 以輸入輸出方式開啟檔案
ios::in|ios::binary 以二進位制方式開啟乙個輸入檔案
ios::out|ios::binary 以二進位制方式開啟乙個輸出檔案
需要注意的是,一般開啟檔案的預設方式是開啟文字檔案,所以二進位制檔案必須顯式開啟。
另外,在輸出的時候也要注意,預設的輸出方式是覆蓋之前的資料,所以如果要儲存之前的資料的話,一定要記得以追加方式輸出啊,我之前就是因為這個問題鬱悶了很久~!
關閉檔案:
這個和c一樣,都是呼叫close()函式,即file.close();
然後就是我們最為關心的流讀寫操作了,先介紹一下常用的i/o流成員函式。
1.輸入:
(1)get():讀取乙個字元或乙個字串
這個函式我所不理解的是書上說它有三種形式,不帶引數,帶乙個引數和帶三個引數,但我自己在用的時候用的都是不帶引數和帶兩個引數的,貌似都可以。
不帶引數的get()是從檔案中讀取乙個字元,而且包括空格,然後返回這個字元。
ifstream fin("test.txt",ios:in);
char ch;
while((ch=fin.get())!=eof)
cout.put(ch);
這樣就能把test中的字元乙個乙個讀取出來輸出螢幕上了,不過它每次只能讀乙個字元。
帶乙個引數的get(char* ch,int size)就是讀取一段固定長度的字串。
ifstream fin("test.txt",ios::in);
char ch[100];
fin.get(ch,10);
cout<>num 的方法把檔案中的整數直接讀到num中。
其實將get()和getline()結合起來使用是一種不錯的選擇,如檔案中的革一行儲存的資料是乙個學生的學號,姓名和位址。
ifstream fin("test.txt",ios::in);
int num;
char name[10];
char address[20];
fin>>num;
fin.get(name,10);
fin.getline(address,20);
這樣,就把一行中的不同資訊都儲存起來了。
(3)read():從檔案中讀取特定字元的位元組,這種方式特別適合二進位制檔案的讀取。
如果想要把乙個物件儲存在檔案中,並以物件的方式讀取資訊,那read()方式真的是太合適了。如想要讀取檔案中乙個學生的資訊。
ifstream fin("test.txt",ios::binary);
student s;
fin.read((char*)&s,sizeof(s));
這樣,不管檔案中儲存的資料有多少不同的型別,抑或根本不知道某一資料的長度,通過這種方式都可以把檔案中的某乙個學生物件資訊儲存在s物件中了。這裡因為s是自定義資料型別,所以要先把它轉化成char* 型別。
2.輸出:
輸出的方法相對來說要少點,因為輸出的過程相對也要簡單一點。
(1)put():向檔案中寫入乙個字元。
ofstream fout("test.txt",ios::out);
char ch[6]="hello";
int i=0;
whlie(ch[i]!=eof)
put(ch[i++]);
這樣就可以把字串 hello 輸出到檔案中了,不過它只能將字元乙個乙個輸出,很不方便。
(2)write():向檔案寫入一定數量的位元組,與read()一樣,這種方式也特別適合二進位制檔案的輸出。尤其是想要把乙個物件儲存到檔案中時。學生類就不在這裡寫出來了。
ofstream fout("test.txt",ios::binary);
student s(1,"jack","1000");
fout.write((char*)&s,sizeof(s));
這樣就把學生物件s以二進位制的方式儲存在檔案中了。這裡有個問題需要注意,如果只是儲存乙個物件可能這樣寫,如果是想儲存多條物件,就得稍微改改了。
這樣才不會覆蓋之前的物件。
當然,其實輸出流還有一種更簡單的形式,就是用fout直接輸出。
int num;
char name[10];
char address[20];
cin>>num>>name>>address;
fout<如此也可以將資料寫入檔案中,讀取時呼叫get()或是getline()函式就行了。
除了這些以外,c++中還有一種隨機檔案的讀取,它可以從檔案的任意位置隨機讀取資料。
這裡面的兩個重要函式就是seekg(n)和tellg()。
seekg(n)可以定位到檔案的位置n,從這一點讀取或寫入資料。
tellg()則是返回當檔案的指標值。
C 之檔案IO操作流
檔案指存放在外部介質上的資料的集合。大家都知道作業系統是以檔案為單位來對資料進行管理的。因此如果你要查詢外部介質的資料,則先要按檔名找到指定檔案,然後再從檔案中讀取資料,如果要把資料存入外部介質中,如果沒有該檔案,則先要建立檔案,再向它輸入資料。由於檔案的內容千變萬化,大小各不相同,為了統一處理,在...
C 檔案流操作
include stdafx.h include include include include include using namespace std void writecharsettofile const string filename void outputfile const strin...
C 檔案流操作
c 的檔案流本質是利用了乙個buffer中間層,有點類似標準輸出和標準輸入一樣。需要包含的標頭檔案 fstream.h 需要的命名空間 std fstream提供了三個類,用來實現c 對檔案的操作,以下對其做個簡要概述。1.ifstream類 2.ofstream類 3.fstream類 支援的檔案...