[C++]輸入/輸出流類庫

丫就是熊個貓貓發表於2016-12-14

輸入/輸出流類庫

 

編譯系統已經以運算子或函式的形式做好了對標準外設(鍵盤、螢幕、印表機、檔案)的介面,使用時只需按照要求的格式呼叫即可。

cin>>x;   cout<<x;

cin.get(ch);

 

輸入輸出流(I/O Stream)

C++語言的I/O系統向使用者提供一個統一的介面,使得程式的設計儘量與所訪問的具體裝置無關,在使用者與裝置之間提供了一個抽象的介面:輸入輸出流。

 

用標準流進行輸入/輸出時,系統自動地完成資料型別的轉換。對於輸入流,要將輸入的字元序列形式的資料變換成計算機內部形式的資料(二進位制或ASCII)後,再賦給變數,變換後的格式由變數的型別確定。對於輸出流,將要輸出的資料變換成字串形式後,送到輸出流(檔案)中。 

過載輸入(提取)和輸出(插入)運算子

class A

{ float x, y;

public:

   A(float a=0, float b=0){  x=a;  y=b;  }

   void Set(float a, float b){ x=a; y=b; }

   void  Show(void){  cout<<x<<‘\t’<<y<<endl;   }

};

void main(void)

{  A   a(2,3);

    a.Set(20 , 30);   輸入物件資料

    a.Show( );     輸出物件資料

}

物件不能直接輸入輸出

在C++中允許使用者過載運算子“<<”和“>>”,實現物件的輸入和輸出。過載這二個運算子時,在物件所在的類中,將過載這二個運算子的函式說明該類的友元函式。

過載提取運算子的一般格式為:

 

istream &  operater >>(istream &is, ClassName &f);

返回值型別:類istream的引用,cin中可以連續使用運算子“>>”。

cin>>a>>b;

第一個引數:是“>>”的左運算元cin型別,類istream的引用

第二個引數:是“>>”的右運算元,即欲輸入的物件的引用.

 

過載輸出(插入)運算子的一般格式為:

 

與輸入(提取)運算子比較:

friend  istream &  operater >>(istream &, ClassName &);

將輸入流改為輸出流。

 

編譯系統已經以運算子或函式的形式做好了對標準外設(鍵盤、螢幕、印表機、檔案)的介面,使用時只需按照要求的格式呼叫即可。

 

檔案流

C++在標頭檔案fstream.h中定義了C++的檔案流類體系 ,當程式中使用檔案時,要包含標頭檔案fstream.h 。

 

當使用檔案時,在程式頭有:#include<fstream.h>

其中定義了各種檔案操作運算子及函式。

程式對文字檔案的操作與對鍵盤、顯示器的操作比較:

 

在涉及文字檔案的操作時,將輸入檔案看成鍵盤,將輸出檔案看成顯示器,格式不變。只需在程式中增加開啟與關閉檔案的語句。

 

檔案的操作

 

56:ASCII表示為 00110101 00110110,佔兩位元組

56:二進位制表示為 111000,佔六個二進位制位

不同的檔案操作的函式、格式不同

 

文字檔案的開啟與關閉

在檔案操作前,需要將程式與被操作的檔案聯絡起來,使程式可以“引用”檔案。

在程式內定義一個檔案類的物件,由該物件與檔案發生聯絡,程式內所有的與檔案的操作都是對該物件的操作。

fstream   infile ,  outfile;    兩個物件,可以聯絡兩個輸入輸出檔案

ifstream    infile;           物件只能聯絡輸入檔案

ofstream   outfile;          物件只能聯絡輸出檔案

 

如何使檔案類的物件與欲操作的檔案發生聯絡?

用物件開啟檔案:

ifstream  infile;  //定義輸入檔案類物件

infile.open(“myfile1.txt”);//利用函式開啟某一檔案

開啟檔案的作用是,使檔案流物件與要使用的檔名之間建立聯絡。

ofstream  outfile;  //定義輸出檔案類物件

outfile.open(“myfile1.txt”);//開啟某一檔案供輸出

infile.open(“myfile1.txt”);

開啟檔案“myfile1.txt”用於輸入,並將這個檔案與輸入檔案類物件infile建立聯絡,今後,在程式中,用到這個檔案“myfile1.txt”的地方就用infile來代替。

outfile.open(“myfile2.txt”);

開啟檔案“myfile2.txt”用於輸出,並將這個檔案與輸出檔案類物件outfile建立聯絡,今後,在程式中,用到這個檔案“myfile2.txt”的地方就用outfile來代替。

如何從檔案中輸入輸出資料?

將檔案類物件看成鍵盤和顯示器即可。

ifstream  infile;  //定義輸入檔案類物件

infile.open(“myfile1.txt”);//利用函式開啟某一檔案

float  x , y;

infile>>x>>y;

 

ifstream  outfile;  //定義輸出檔案類物件

infile.open(“myfile2.txt”);//利用函式開啟某一檔案

  float x=3 , y=4;

outfile<<x<<‘\t’<<y<<endl;

 

4)用完檔案後,使用成員函式關閉檔案.如:

ifstream  infile;

ofstream outfile

infile.open(“myfile1.txt”);

outfile.open(“myfile2.txt”);

float x,y;

infile>>x>>y;

outfile<<x<<‘\t’<<y<<endl;

infile.close();

outfile.close();

void main(void)

{  int a[10];

   ifstream   infile;//定義輸入檔案類

   ofstream outfile;//定義輸出檔案類

   infile.open(“file1.txt”);//開啟一個輸入檔案“file1.txt”

   outfile.open(“file2.txt”);//開啟一個輸出檔案“file2.out”

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

         infile>>a[i];//將“file1.txt”中的十個整型數輸入到a[i]中

    for(i=0;i<10;i++)

          outfile<<a[i]<<‘\t’;//將a[i]中的十個數輸出到檔案“file2.txt”中

    outfile<<endl;

   infile.close();//關閉輸入檔案

   outfile.close();//關閉輸出檔案

}

 

當用類fstream定義檔案物件時,該物件即能定義輸入檔案物件,又能定義輸出檔案物件,所以開啟檔案時,必須在成員函式open()中的引數中給出開啟方式(讀或寫)。

 

在開啟檔案後,都要判斷開啟是否成功。若開啟成功,則檔案流物件值為非零值;若開啟不成功,則其值為0。

ifstream    pfile1,pfile2;//定義了兩個檔案類的物件

pfile1.open(“file1.txt”,  ios::in);

pfile2.open(“file2.txt”, ios::out);

if (!pfile1)  //若為0,開啟檔案操作失敗

 {cout <<”不能開啟輸入檔案:file1.txt”<<’\n’;  exit(1);}

if (!pfile2)

 {cout <<”不能開啟輸出檔案:file2.txt”<<’\n’;  exit(1);}

開啟輸入檔案時,檔案必須存在。

開啟輸出檔案時,若檔案不存在,則建立檔案;若檔案存在,則刪除原檔案的內容,使其成為一個空檔案。

 

涉及到字串的檔案讀寫

char  ch,  str[300];

ifstream   infile(“myfile1.txt”);

ofstream  outfile(“myfiel2.txt”);

從檔案輸入一字元或一行字元,當輸入至檔案尾時,函式返回值為0,可以據此來判斷迴圈結束。

從鍵盤輸入一個字元:cin.get(ch);

從檔案輸入一個字元:infile.get(ch);

向顯示器輸出一個字元:cout.put(ch);

向檔案輸出一個字元:outfile.put(ch);

從鍵盤輸入一行字元:cin.getline(str,300);

從檔案輸入一行字元:infile.getline(ch,300);

 

二進位制檔案的讀寫操作

若在檔案的開啟方式中沒有特別說明,開啟的檔案均為ASCII碼檔案,若要開啟二進位制檔案,則要特別說明並用特定的讀寫函式。

 

由於二進位制檔案中的資料不是ASCII碼,故不能直接對其讀寫,必須要通過特定的函式予以轉換。

 

判斷二進位制檔案是否讀到檔案尾?

infile.eof( )    

當到達檔案結束位置時,該函式返回一個非零值;否則返回零。

fstream   infile;

infile.open(“data1.dat”,ios::in|ios::binary);

if(!infile)   //判斷開啟是否出錯

{   cout<<“Open Error!\n”;  exit(1);  }

char  str[300];

while(!infile.eof())   //判斷是否讀到檔案尾

     infile.read(str, 300);

 

檔案指標

當一開啟檔案,檔案指標位於檔案頭,並隨著讀寫位元組數的多少順序移動。

可以利用成員函式隨機移動檔案指標。

 

隨機讀取二進位制檔案

infile.seekg(int);//將檔案指標移動到由引數指定的位元組處

infile.seekg(100);//將檔案指標移動到距離檔案頭100個位元組處

 

infile.seekg(100, ios::beg);//移動到距檔案頭100個位元組

infile.seekg(-100, ios::cur);//移動到距當前位置前100個位元組

infile.seekg(-500, ios::end);//移動到距檔案尾前500個位元組

 

相關文章