1 簡單讀寫文件
1 #include <fstream> 2 ofstream //文件寫操作 內存寫入存儲設備 3 ifstream //文件讀操作,存儲設備讀區到內存中 4 fstream //讀寫操作,對打開的文件可進行讀寫操作
寫文件用ofstream和ostream方法(如<<),讀文件用ifstream和istream方法(如>>),讀寫文件可以用fstream,具體步驟個人總結為三步走:
寫文件:
1.創建一個ofstream對象 ofstream out;
2.將對象與文件進行關聯 out.open("1.txt");
3.用cout方式使用該對象 out<<"123456";
其中前兩步可以合並為ofstream out("1.txt");
讀文件:
1.創建一個ifstream對象 ifstream in;
2.將對象與文件進行關聯 in.open("1.txt");
3.用cout方式使用該對象 string x; in>>x;
其中前兩步可以合並為ifstream in("1.txt");
注意:對象名稱可以隨意命名,不一定非得是in或out。
文件讀寫完畢后文件自動關閉,亦可顯示的關閉文件的連接,比如in.close();
2 文件模式
無論是使用文件名初始化文件流對象還是使用open()方法,都可以指定文件模式的第二個參數
ios::in 打開文件以便讀取
ios::out 打開文件以便寫入
ios::ate 打開文件移動到文件尾
ios::app 內容追加到文件尾
ios::trunc 刪除之前內容再寫入
ios::binary 二進制文件
這些方式是能夠進行組合使用的,以“或”運算(“|”)的方式:例如
1 fstream out("Hello.txt", ios::in|ios::out)
3 利用流復制文件的例子
1 #include <iostream> 2 #include <fstream> 3 #include <cstdlib> 4 5 using namespace std; 6 void cpf(char *a,char *b); 7 8 int main() 9 { 10 char sourcefile[100]; 11 char copyfile[100]; 12 cout<<"請輸入要復制的文件路徑"<<endl; 13 cin>>sourcefile; 14 cout<<"請輸入要粘貼的文件路徑"<<endl; 15 cin>>copyfile; 16 17 cpf(sourcefile,copyfile); 18 19 return 0; 20 } 21 22 void cpf(char *a,char *b) 23 { 24 fstream in(a,ios::in | ios::binary); 25 if(!in.is_open()) 26 { 27 cerr<<"源文件不存在"<<endl; 28 exit(EXIT_FAILURE); 29 } 30 fstream out(b,ios::out | ios::binary); 31 if(!out.is_open()) 32 { 33 cerr<<"路徑錯誤"<<endl; 34 exit(EXIT_FAILURE); 35 } 36 out<<in.rdbuf(); 37 cout<<"文件復制成功"<<endl; 38 }
需要注意的地方
1.文件路徑是char數組,傳遞參數時應該將形參設為指針
2.復制文件應該用ios::binary(二進制模式),原因是使用二進制文件模式時,程序將數據從內存傳遞給文件,將不會發生任何隱藏的轉換,而默認狀態下是文本模式,復制的內容可能會發生改變(參見c++ primer plusP695)
3.關於 rebuf():復制文件時是從一個流對象復制流入另外一個流對象,需要使用rebuf(),rebuf()的功能就是使流重定向
4.exit(EXIT_FAILURE)相當於exit(1),exit(EXIT_SUCCESS)相當於exit(0)
5.注意#include<fstream> 也需要和using namespace std 搭配
4 隨機存取
利用對文件指針的操作可以實現隨機存取,考察函數:
定位文件指針函數:seekg()將輸入指針移動到指定文件位置(對應讀文件);seekp()將輸出指針移動到指定文件位置(對應寫文件),其原型有兩種:
(1) istream& seekg (streampos pos);
//定位讀文件指針到離文件開頭特定距離(單位為字節)
(2) istream& seekg (streamoff off, ios_base::seekdir way);
//定位讀文件指針到離第二個參數特定的距離(單位為字節) 第二個參數可以是:
ios_base::beg 文件開頭
ios_base::cur 當前指針位置
ios_base::end 文件結尾位置
seekg與之類似,ios_base::beg 亦做ios::beg
檢查文件指針當前位置,對輸入流采用tellg()方法,對輸出流,采用tellp()方法,一個C++獲取文件大小的方法是:
1 in.seekg(0,ios::end); 2 long size; 3 size = in.tellg();
5 利用成員函數復制文件的例子
利用成員函數read()和wirte()復制文件,函數原型如下:
istream &read(char *p,sizeof(p));
ostream &write(char *p,sizeof(p));
1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 5 int main() 6 { 7 8 fstream in("e:\\1.png",ios::in | ios::binary); 9 if(!in.is_open()) 10 { 11 cerr<<"源文件不存在"<<endl; 12 exit(EXIT_FAILURE); 13 } 14 fstream out("e:\\2.png",ios::out | ios::binary); 15 if(!out.is_open()) 16 { 17 cerr<<"路徑錯誤"<<endl; 18 exit(EXIT_FAILURE); 19 } 20 in.seekg(0,ios::end); 21 long size; 22 size = in.tellg(); 23 char *buf = new char[size]; 24 in.seekg(ios::beg); 25 in.read(buf,size); 26 out.write(buf,size); 27 delete [] buf; 28 cout<<"文件復制成功"<<endl; 29 return 0; 30 }
復制大文件時buf不應該開辟太大,可以分段復制,比如:
1 const int bufsize = 1024; 2 char buf[bufsize]; 3 in.seekg(0,ios::end); 4 long size; 5 size = in.tellg(); 6 in.seekg(ios::beg); 7 8 while(!in.eof()) 9 { 10 in.read(buf,bufsize); 11 out.write(buf,bufsize); 12 }