C++文件fstream的操作


                用到的關於輸入輸出fstream流相關的知識   


1.兩個主要函數:read( )函數

從流中讀取字符串的成員函數read
該成員函數一般形式是:read(char* pch, int nCount)
從輸入流中讀取nCount個字符。當輸入流中的字符數小於nCount時,結束讀取。經常使用read函數讀取二進制數據。
write( )函數
成員函數write()輸出一串字符。
該成員函數一般形式是:write(char* pch, int nCount)
其中,pch是指向字符數組的指針; nCount指明從第一個參數中復制輸出字符的個數。
2. 文件的隨機讀寫
(1)輸出流隨機訪問函數
  輸出流(output)隨機訪問函數有seekp和tellp。
(2)輸入流隨機訪問函數
  輸入流隨機訪問函數有seekg和tellg。


3. 獲得和設置流指針(get and put stream pointers)
所有輸入/輸出流對象(i/o streams objects)都有至少一個流指針:


ifstream, 類似istream, 有一個被稱為get pointer的指針,指向下一個將被讀取的元素。ofstream, 類似 ostream, 有一個指針 put pointer ,指向寫入下一個元素的位置。


fstream, 類似 iostream, 同時繼承了get 和 put

4. 設置流指針位置
我們可以通過使用以下成員函數來讀出或配置這些指向流中讀寫位置的流指針:
tellg() 和 tellp()
這兩個成員函數不用傳入參數,返回pos_type 類型的值(根據ANSI-C++ 標准) ,就是一個整數,代表當前get 流指針的位置 (用tellg) 或 put 流指針的位置(用tellp).
seekg() 和seekp()
這對函數分別用來改變流指針get 和put的位置。兩個函數都被重載為兩種不同的原型:
seekg ( pos_type position );
seekp ( pos_type position );
使用這個原型,流指針被改變為指向從文件開始計算的一個絕對位置。要求傳入的參數類型與函數 tellg 和tellp 的返回值類型相同。
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );
使用這個原型可以指定由參數direction決定的一個具體的指針開始計算的一個位移(offset)。它可以是:
ios::beg 從流開始位置計算的位移
ios::cur 從流指針當前位置開始計算的位移
ios::end 從流末尾處開始計算的位移
流指針 get 和 put 的值對文本文件(text file)和二進制文件(binary file)的計算方法都是不同的,因為文本模式的文件中某些特殊字符可能被修改。
由於這個原因,建議對以文本文件模式打開的文件總是使用seekg 和 seekp的第一種原型,而且不要對tellg 或 tellp 的返回值進行修改。

對二進制文件,你可以任意使用這些函數,應該不會有任何意外的行為產生

#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
int main ()
{
    long pos;//存儲寫指針位置(字節)
 
    char array[100]; //字符數組用來存放從文件中讀取的字符串
 
    ofstream outfile; //建立輸出文件流對象
 
    ifstream infile;  //建立輸入文件流對象
 
    outfile.open ("test.txt"); //將輸出流對象與test.txt文件關聯
 
    infile.open ("test.txt");  //將輸入流對象與test.txt文件關聯
 
    if(!outfile&&!infile)
    {
        cout<<"file error!";
        exit(1);
    }
 
    cout<<"開始寫入時,寫指針位置為:"<<outfile.tellp()<<endl; 
 
    //outfile.write ("This is an apple.",sizeof("This is an apple.")-1); //參見輸出流的write方法,向文件test.txt中輸出字符串
    outfile.write ("This is an apple.",strlen("This is an apple.")); //參見輸出流的write方法,向文件test.txt中輸出字符串
 
    pos=outfile.tellp();//獲取寫入字符串后,寫指針位置(與文件開始之間的字節數)
    
    cout<<"寫入后,寫指針位置為:"<<pos<<endl;   
 
    cout<<"開始讀入時,讀指針位置為:"<<infile.tellg()<<endl;
 
    infile.getline(array,pos+1); //將test.txt讀取的內容存入數組array中
 
    cout<<"讀入后,讀指針位置為:"<<infile.tellg()<<endl;
 
    cout<<array<<endl;
 
    outfile.seekp (pos-8);//將寫指針從當前位置向后移動(文件開頭位置)8個字節
 
    pos=outfile.tellp();//獲取寫指針移動后,寫指針位置(與文件開始之間的字節數)
 
    cout<<"將當前指針向前移動8個字節后,寫指針位置為:"<<outfile.tellp()<<endl;
 
    outfile.write (" sam",sizeof(" sam")-1); //在從當前寫指針位置開始寫入字符串
 
    pos=outfile.tellp();//獲取再次寫入后,寫指針位置(與文件開始之間的字節數)
 
    cout<<"再此寫入后,寫指針位置為:"<<pos<<endl;
 
    infile.seekg(0,ios::beg); //讀指針定位到文件開頭
 
    cout<<"重新從文件開頭讀入時,讀指針位置為:"<<infile.tellg()<<endl;
    
    outfile.seekp(0,ios::end); //文件的寫指針定位到文件最后
 
    pos=outfile.tellp();//獲取寫指針位置(與文件開始之間的字節數)
 
    cout<<"將寫指針定位到文件最后位置為:"<<pos<<endl;
   
    infile.sync();//清除緩沖區
    infile.clear();//清除錯誤狀態,在這個程序里,兩個必須一起用,否則  達不到效果
    //以上兩條語句非常重要,如果去掉,就讀不進來了
 
    infile.getline(array,pos+1); //將test.txt讀取的內容存入數組array中
 
    cout<<"讀入后,讀指針位置為:"<<infile.tellg()<<endl; 
 
    cout<<array<<endl;
 
    outfile.close(); //關閉文件
 
    infile.close(); //關閉文件
 
    return 0;

}

 

 

 

注意:由於ifstream的讀入文件不正常,導致讀文件指針一直不正確。

每次寫入后,都自動更新當前寫指針的位置。

 


 


免責聲明!

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



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