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

相關的頭文件:#include <fstream>ios

須要相關的類數組

fstream提供三種類,實現C++對文件的操做函數

ofstream:寫操做,由ostream引伸而來spa

ifstream:讀操做,由istream引伸而來 操作系統

fstream :同時讀寫操做,由iostream引伸而來 指針

文件的類型:文本文件 和 二進制文件對象

文件讀寫的步驟:內存

一、包含的頭文件:#include <fstream>get

二、建立流原型

三、打開文件(文件和流關聯)

四、讀寫 (寫操做:<<,put( ), write( ) 讀操做: >> , get( ),getline( ), read( ))

五、關閉文件:把緩衝區數據完整地寫入文件, 添加文件結束標誌, 切斷流對象和外部文件的鏈接

 

文件的讀寫:

一、文本文件的讀寫:

方法:

一次性讀寫若干字符

       1)使用運算符<< 和 >>進行讀寫

       功能:

       << 能實現以行爲單位寫入文件

       >> 不能一行爲單位讀入內存,老是以空格、Tab、回車結束,而是以單詞爲單位

代碼:

函數功能:使用<< ,寫入文件一行字符


 

#include <fstream>  

#include <iostream>  

using namespace std;  

void main()  

{  

  ofstream OpenFile("file.txt");  

  if (OpenFile.fail())  

  {  

    cout<<"打開文件錯誤!"<<endl;  

    exit(0);  

   }  

    OpenFile<<"abc def ghi";  

  OpenFile.close();  

  system("pause");  

}  

運行結果:文件中寫入內容:abc def ghi

函數功能:使用>>,從文件讀入一個單詞


 

#include <fstream>  

#include <iostream>  

using namespace std;  

void main()  

{  

  const int len=20;  

  char str[len];  

     ifstream OpenFile("file.txt");  

  if (OpenFile.fail())  

     {  

        cout<<"打開文件錯誤!"<<endl;  

        exit(0);  

    }  

    OpenFile>>str;  

    cout<<str<<endl;  

    OpenFile.close();  

    system("pause");  

}  

運行結果:str的內容爲abc,而不是abc def ghi(見空格中止)

       2)使用運算符<<(寫)和getline()進行讀寫

       功能:

       <<:以行爲單位輸入文件

       getline():以行爲單位 讀入內存,能一次讀入一行

       函數原型:istream &getline( char *buffer, streamsize num );

       功能:getline( )函數用於從文件讀取num-1個字符到buffer(內存)中,直到下列狀況發生時,讀取結束:

       1):num - 1個字符已經讀入

       2):碰到一個換行標誌

       3):碰到一個EOF

代碼:

 

 

#include <fstream>  

#include <iostream>  

using namespace std;  

void main()  

{  

  const int len=20;  

  char str[len];  

      ifstream OpenFile("file.txt");  

  if (OpenFile.fail())  

    {  

        cout<<"打開文件錯誤!"<<endl;  

        exit(0);  

    }  

    OpenFile.getline(str,20);  

    cout<<str<<endl;  

    OpenFile.close();  

    system("pause");  

}  

運行結果:str的內容爲abc def ghi (一直把一行讀完)

一次讀寫一個字符:

使用get( )和put( )函數

函數聲明:istream& get(char &c);

函數功能:使用 get( )函數 把字符1輸入到文件

 

 

#include <fstream>  

#include <iostream>  

using namespace std;  

void main()  

{  

  char ch='1';  

     ofstream OpenFile("file.txt");  

  if (OpenFile.fail())  

    {  

        cout<<"打開文件錯誤!"<<endl;  

        exit(0);  

    }  

    OpenFile.put(ch);  

    OpenFile.close();  

    system("pause");  

}  

運行結果:把字符1寫入文件

函數功能:使用 put( )函數 把文件中第一個字符輸入內存


 

#include <fstream>  

#include <iostream>  

using namespace std;  

void main()  

{  

  char ch;  

     ifstream OpenFile("file.txt");  

  if (OpenFile.fail())  

    {  

        cout<<"打開文件錯誤!"<<endl;  

        exit(0);  

    }  

    OpenFile.get(ch);  

    cout<<ch;  

    OpenFile.close();  

    system("pause");  

}  

運行結果:把字符1從文件中讀到ch(內存)中

二、二進制文件的讀寫:

  1)使用運算符get( ) 和 put( )讀寫一個字節

功能:

       get( ) :在文件中讀取一個字節到內存

函數原型:ifstream &get(char ch)

       put( ) :在內存中寫入一個字節到文件

函數原型:ofstream &put(char ch)

代碼:

功能:把26個字符寫入文件中


 

#include <fstream>  

#include <iostream>  

using namespace std;  

void main()  

{  

  char ch='a';  

    ofstream OpenFile("file.txt",ios::binary);  

  if (OpenFile.fail())  

    {  

        cout<<"打開文件錯誤!"<<endl;  

        exit(0);  

    }  

  for (int i=0;i<26;i++)  

    {  

        OpenFile.put(ch);  

        ch++;  

    }  

    OpenFile.close();  

    system("pause");  

}  

運行結果:文件內容爲abcdefghijklmnopqlst...z

功能:把文件中的26個字母讀入內存


 

#include <fstream>  

#include <iostream>  

using namespace std;  

void main()  

{  

  char ch;  

      ifstream OpenFile("file.txt",ios::binary);  

  if (OpenFile.fail())  

    {  

        cout<<"打開文件錯誤!"<<endl;  

        exit(0);  

    }  

  while (OpenFile.get(ch))  

        cout<<ch;  

    OpenFile.close();  

    system("pause");  

}  

運行結果:ch依次爲abc...z

   2)使用read()和write()進行讀寫

  read( ):

       功能:從文件中提取 n 個字節數據,寫入buf指向的地方中

       函數聲明:istream &  read ( char * buf ,  int  n ) ;

代碼:

 函數功能:使用write( )函數,一次從內存向文件寫入一行數據


 

#include <fstream>  

#include <iostream>  

using namespace std;  

void main()  

{  

  char ch[12]="12 3 456 78";  

    ofstream OpenFile("file.txt");  

  if (OpenFile.fail())  

    {  

        cout<<"打開文件錯誤!"<<endl;  

        exit(0);  

    }  

    OpenFile.write(ch,12);  

    OpenFile.close();  

    system("pause");  

}  

運行結果:文件內容12 3 456 78

write( ):

      功能:把buf指向的內容取n個字節寫入文件

      函數聲明:ostream & ostream :: write ( char * buf ,  int  n ) ;

      參數說明:buf表示要寫入內存的地址,傳參時要取地址。n表示要讀入字節的長度

      注意:1):該函數遇到空字符時並不中止,於是可以寫入完整的類結構

                  2):第一個參數一個char型指針(指向內存數據的起始地址),與對象結合使用的時候,要在對象地址以前要char作強制類型轉換。

函數功能:使用write( )函數,一次從文件向內存寫入一行數據


 

#include <fstream>  

#include <iostream>  

using namespace std;  

void main()  

{  

  char ch[12];  

     ifstream OpenFile("file.txt");  

  if (OpenFile.fail())  

    {  

        cout<<"打開文件錯誤!"<<endl;  

        exit(0);  

    }  

    OpenFile.read(ch,12);  

    cout<<ch;  

    OpenFile.close();  

    system("pause");  

}  

運行結果:數組ch的內容爲12 3 456 78 。

說明:

一、程序再也不使用文件時,爲何要關閉文件?

由於:1)文件緩衝區是一塊小的內存空間.

            2)操做系統限制同時打開的文件數量  

注意:close ( ) 函數關閉文件,但流對象仍然存在。

二、文件的默認打開方式爲文本文件,要是想以二進制的方式處理,在打開時要用 ios::binary 顯式聲明。

三、針對文本文件操做時,get函數和>>的區別:

區別:在讀取數據時,get函數包括空白字符(遇空白字符不中止讀取)
            >>在默認狀況下拒絕接受空白字符(遇到空白符中止讀取)
四、判斷文件是否打開的方法:

 

if (OpenFile)  

{  

    cout<<"打開文件失敗!";  

    exit(0);  

}  

if (OpenFile.fail())  

{  

    cout<<"打開文件錯誤!"<<endl;  

    exit(0);  

}  

五、判斷文件是否結束的方法:
         1)使用成員函數eof()能夠檢測到這個結束符,若是非0表示文件結束。

 

  while (!OpenFile.eof())  

    {  

    //文件結束時的代碼  

    }  

         2)使用流直接檢測,若是爲0表示文件結束

 

  while (!OpenFile)  

    {  

    //文件結束時的代碼  

    }  

         3)使用get函數,讀取最後一個結束符時,返回0.讀取正常狀況下,返回1,並把讀取的字符放到ch中

 

 

  while ( (OpenFile.get(ch) )!=EOF)  

    {  

    //成功時候的代碼  

    }  

文本文件的讀寫常使用的方法:使用<<寫入文件,使用getline 和 >> 讀到內存

二進制文件的讀寫常使用的方法:使用istream 類的成員函數read 和write 來實現,

這兩個成員函數的原型爲:

 

 

 

istream& read(char *buffer,int len);  

ostream& write(const char * buffer,int len);   

參數說明:字符指針 buffer 指向內存中一段存儲空間。len 是讀/寫的字節數。

與對象結合寫入二進制文件時:

        write函數調用語句:


 

輸出文件流對象名.write((char*)& 對象名,sizeof(<對象所屬類名>));  

輸出文件流對象名.write((char*)& 對象數組名[下標],sizeof(<對象所屬類名>));  

        read函數調用語句:


 

輸入文件流對象名.read((char*)& 對象名,sizeof(<對象所屬類名>));          

輸入文件流對象名.read((char*)& 對象數組名[下標],sizeof(<對象所屬類名>));      

注意:gcount()函數常常和read函數配合使用,用來得到實際讀取的字節數。

二進制文件的隨機讀寫

 

#include <iostream>  

#include <fstream>  

using namespace std;  

int main(void)  

{  

  //寫文件:二進制存儲1234  

  int writeNum1 = 1;  

  int writeNum2 = 2;  

  int writeNum3 = 3;  

  int writeNum4 = 4;  

    ofstream fout("test.txt", ios::out | ios::binary);  

    fout.write(reinterpret_cast<char *>(&writeNum1), sizeof(int));  

    fout.write(reinterpret_cast<char *>(&writeNum2), sizeof(int));  

    fout.write(reinterpret_cast<char *>(&writeNum3), sizeof(int));  

    fout.write(reinterpret_cast<char *>(&writeNum4), sizeof(int));  

    fout.close();  

  //讀文件  

    ifstream fin("test.txt",ios::in | ios::binary);  

  if (!fin.good())  

    {  

        cout<<"文件打開錯誤"<<endl;    

        exit(0);  

    }  

  int readNum = 0;  

  //第一次輸出:從第一個數字輸出,結果是1 2 3 4  

    fin.seekg(0,ios::beg);  

  while (fin.peek() != EOF)  

    {  

        fin.read(reinterpret_cast<char*>(&readNum), sizeof(int));  

        cout<<readNum<<" ";  

    }  

  cout<<endl;  

  //第二次輸出:從第三個數字輸出,結果是3 4

  fin.seekg(2 * sizeof(int),ios::beg);//遊標移動的次數 = 須要處理數的個數 × int佔的字節數  

  while (fin.peek() != EOF)  

    {  

        fin.read(reinterpret_cast<char*>(&readNum), sizeof(int));  

        cout<<readNum<<" ";  

    }  

    cout<<endl;  

     fin.close();  

      system("pause");  

  return 0;  

}  

相關文章
相關標籤/搜索