程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【轉】C++文件讀寫詳解(ofstream,ifstream,fstream)

【轉】C++文件讀寫詳解(ofstream,ifstream,fstream)

編輯:C++入門知識

在看C++編程思想中,每個練習基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含義,在看了幾位大牛的博文後,進行整理和總結:


這裡主要是討論fstream的內容:

[java] view plaincopyprint?
  1. #include <fstream>  
  2. ofstream         //文件寫操作 內存寫入存儲設備   
  3. ifstream         //文件讀操作,存儲設備讀區到內存中  
  4. fstream          //讀寫操作,對打開的文件可進行讀寫操作   

在fstream類中,成員函數open()實現打開文件的操作,從而將數據流和文件進行關聯,通過ofstream,ifstream,fstream對象進行對文件的讀寫操作

函數:open()

[cpp] view plaincopyprint?
  1. <span >  
  2. public member function  
  3.   
  4. void open ( const char * filename,  
  5.             ios_base::openmode mode = ios_base::in | ios_base::out );  
  6.   
  7. void open(const wchar_t *_Filename,  
  8.         ios_base::openmode mode= ios_base::in | ios_base::out,  
  9.         int prot = ios_base::_Openprot);  
  10.   
  11. </span>  

參數: filename   操作文件名

           mode        打開文件的方式

           prot         打開文件的屬性                            //基本很少用到,在查看資料時,發現有兩種方式

打開文件的方式在ios類(所以流式I/O的基類)中定義,有如下幾種方式:

 

這些方式是能夠進行組合使用的,以“或”運算(“|”)的方式:例如

[cpp] view plaincopyprint?
  1. ofstream out;  
  2. out.open("Hello.txt", ios::in|ios::out|ios::binary)                 //根據自己需要進行適當的選取  

打開文件的屬性同樣在ios類中也有定義:

0 普通文件,打開操作 1 只讀文件 2 隱含文件 4 系統文件

對於文件的屬性也可以使用“或”運算和“+”進行組合使用,這裡就不做說明了。

很多程序中,可能會碰到ofstream out("Hello.txt"), ifstream in("..."),fstream foi("...")這樣的的使用,並沒有顯式的去調用open()函數就進行文件的操作,直接調用了其默認的打開方式,因為在stream類的構造函數 中調用了open()函數,並擁有同樣的構造函數,所以在這裡可以直接使用流對象進行文件的操作,默認方式如下:

[cpp] view plaincopyprint?
  1. <span >  
  2. ofstream out("...", ios::out);  
  3. ifstream in("...", ios::in);  
  4. fstream foi("...", ios::in|ios::out);  
  5.   
  6. </span>  

當使用默認方式進行對文件的操作時,你可以使用成員函數is_open()對文件是否打開進行驗證



[cpp] view plaincopyprint?
  1.   // writing on a text file  
  2.  #include <fiostream.h>  
  3.  int main () {  
  4.      ofstream out("out.txt");  
  5.      if (out.is_open())   
  6.     {  
  7.          out << "This is a line.\n";  
  8.          out << "This is another line.\n";  
  9.          out.close();  
  10.      }  
  11.      return 0;  
  12.  }  
  13. //結果: 在out.txt中寫入:  
  14. This is a line.  
  15. This is another line   

從文件中讀入數據也可以用與 cin>>的使用同樣的方法:

[cpp] view plaincopyprint?
  1. // reading a text file  
  2.    #include <iostream.h>  
  3.    #include <fstream.h>  
  4.    #include <stdlib.h>  
  5.      
  6.    int main () {  
  7.        char buffer[256];  
  8.        ifstream in("test.txt");  
  9.        if (! in.is_open())  
  10.        { cout << "Error opening file"; exit (1); }  
  11.        while (!in.eof() )  
  12.        {  
  13.            in.getline (buffer,100);  
  14.            cout << buffer << endl;  
  15.        }  
  16.        return 0;  
  17.    }  
  18.    //結果 在屏幕上輸出  
  19.     This is a line.  
  20.     This is another line  

  • bad()

  • fail()

  • eof()

  • good()

 

  • tellg() 和 tellp()

  • seekg() 和seekp()

    seekp ( pos_type position );

    seekp ( off_type offset, seekdir direction );

[cpp] view plaincopyprint?
  1. // obtaining file size  
  2.    #include <iostream.h>  
  3.    #include <fstream.h>  
  4.      
  5.    const char * filename = "test.txt";  
  6.      
  7.    int main () {  
  8.        long l,m;  
  9.        ifstream in(filename, ios::in|ios::binary);  
  10.        l = in.tellg();  
  11.        in.seekg (0, ios::end);  
  12.        m = in.tellg();  
  13.        in.close();  
  14.        cout << "size of " << filename;  
  15.        cout << " is " << (m-l) << " bytes.\n";  
  16.        return 0;  
  17.    }  
  18.     
  19.   //結果:  
  20.   size of example.txt is 40 bytes.  


 

read ( char * buffer, streamsize size );

 

[cpp] view plaincopyprint?
  1. // reading binary file  
  2.     #include <iostream>  
  3.     #include <fstream.h>  
  4.       
  5.     const char * filename = "test.txt";  
  6.       
  7.     int main () {  
  8.         char * buffer;  
  9.         long size;  
  10.         ifstream in (filename, ios::in|ios::binary|ios::ate);  
  11.         size = in.tellg();  
  12.         in.seekg (0, ios::beg);  
  13.         buffer = new char [size];  
  14.         in.read (buffer, size);  
  15.         in.close();  
  16.           
  17.         cout << "the complete file is in a buffer";  
  18.           
  19.         delete[] buffer;  
  20.         return 0;  
  21.     }  
  22.     //運行結果:  
  23.     The complete file is in a buffer  

 

    • 當文件被關閉時: 在文件被關閉之前,所有還沒有被完全寫出或讀取的緩存都將被同步。
    • 當緩存buffer 滿時:緩存Buffers 有一定的空間限制。當緩存滿時,它會被自動同步。
    • 控制符明確指明:當遇到流中某些特定的控制符時,同步會發生。這些控制符包括:flush 和endl。
    • 明確調用函數sync(): 調用成員函數sync() (無參數)可以引發立即同步。這個函數返回一個int 值,等於-1 表示流沒有聯系的緩存或操作失敗。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved