C++文件讀寫


 

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     }

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM