檔案流操作之C 版

2021-07-29 15:55:53 字數 3747 閱讀 4577

昨天簡單介紹了一下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類 支援的檔案...