一直到現在,我還是用鍵盤對程序進行輸入,但是實際情況中大部分是對文件進行讀取和輸出,今天就學習一下對文件的輸入輸出 .
根據文件對數據的組織形式 , 可分為ascll文件和二進制文件 "ascll"文件 又稱 文本文件或字符文件 . 文件流 不是若干個文件組成的流 而是以 文件流輸入輸出 若要對文件進行輸入輸出 , 若要對文件進行輸入輸出 . 就必須通過文件流 來實現 .
現有 三個 用於文件操作的文件類 .
ifstream 類 他是從istream類 派生而來的 . 支持從磁盤文件的 輸入
ofstream 類 他是從ostream類 派生而來的 . 支持從磁盤文件的 輸出
fstream 類 他是從iostream類 派生而來的 . 支持對磁盤文件的輸入輸出 .
可以用下面一個方法 , 建立一個對文件的輸出流對象 .
ofstream outfile;
如同在頭文件iostream中定義了 劉對象cout 一樣 , 現在在程序中定義了 outfile 為ofstream類 的對象 , 但是還有一個問題沒有解決 . 在定義 cout 是已經將他和標准輸出設備( 顯示器 ) , 建立關聯 , 而現在雖然建立了一個輸出文件流對象 . 但是還未指定他想那一個磁盤文件輸出 , 需要在使用的時候 加以定義 . 下面解決這個問題 .
文件的打開和關閉 .
( 1 ) : 為文件流對象和指定的磁盤之間建立聯系 .一邊是文件流流向指定的磁盤文件 .
( 2 ) : 指定文件的工作方式 . 例如該文件是作為輸入文件還是輸出文件 ,是ascll 文件 還是 二進制文件 .
以上工作可以通過兩種不通過的方式實現 .
ofstream outfile; // 定義 ofstream 類 (輸出文件類) outfile.open("fl.dat",ios::out); // 使文件與fl.dat文件建立聯系 ,
第二行是調用文件輸出流的 .open打開磁盤的 fl.dat 文件並制定它為輸出文件 . 文件流對象將磁盤文件fl.dat輸出數據 ios::out 是I/O 模式的一種 , 表示以輸出方式打開一個文件 . 或者簡單說 , 此時的fl.dat 是一個輸出文件 , 接收從內存 輸出的數據 .
調用成員函數 open 的一般形式 為 .
文件流對象.open(磁盤文件名,輸入輸出方式);
磁盤文件名可以包括路徑 如 " c:\new\fl.dat " , 如果缺少路徑名的話 就默認為當前路徑 .
在定義文件流對象時帶指定參數 ,
在聲明文件流對象時定義了帶參數的構造函數 , 其中包含了打開磁盤文件的功能 , 因此可以在定義文件流對象時指定參數,調用文件類的構造函數 , 來實現打開文件的功能 . ru
ostream outfile("fl.dat",ios::out); // 一般情況下多用此形式 , 比較方便 , 作用於open函數 相同 .
輸入輸出實在ios類中定義的 , 他們是枚舉常量有多種選擇 .
( 1 ) 新版本的I/O 類庫中不提供ios::nocreate和ios::noreplace
( 2 ) 每一個打開的文件都有一個文件指針,該指針的初始位置由I/O方式制定,每次讀寫都從文件指針的當前位置開始.每讀入一個字節,指針就后移一個直接.當文件指針移到最后就會遇到文件的結束(文件的結束也占一個字節,其值為-1),此時劉對象的成員函數eof的值為非零值(一般為1),表示文件結束.
( 3 ) 可以用"位或"運算符"|"對輸入輸出方式進行組合
上述的方式倒可以組合但是像下面這一種互相排斥的不可以
ios::nocreate|ios::noreplace ( 4 ) 如果打開操作失敗,open函數的返回值為0 , 如果是構造函數的方式打開文件的,則劉對象的值為0.可以據此測試打開是否為0 如
if(outfile.open("fl.dat",ios::app)==0) cout<<"open error"; 或 if(!outfile.open("fl.dat",ios::app)) cout<<"open error";
2 : 關閉文件 .
在對已打開的磁盤文件的讀寫操作完成后,應關閉該文件.關閉文件用成員函數close 如 . outfile.close(); // 將輸出文件流所關聯的磁盤文件關閉
所謂關閉,實際上是解除該磁盤文件與文件流的關聯,原來設置的工作方式也失效,這樣,就不能在通過文件流對該文件進行輸入輸出.此時可以將文件流與其他磁盤文件建立關聯,通過文件流對新的文件進行輸入或輸出.
對ascll文件的操作.
ascll文件 : 如果文件的每一個直接中均以ascllascll代碼的形式存放數據 , 即一個字節存放一個字符 , 這個文件就是ascll 文件( 或稱字符文件 ) 對ascll 文件的操作,可以用兩種方法;
用流插入運算符 "<<" 和流提取運算符 ">>" 輸入輸出標准類型的數據. "<<"和">>" 都已經在 iostream 中被重載為能用於ostream 和istream類對象的標准類型的輸入輸出 . 由於ifstream和ofstream分別是ostream和istream類的派生類型 . 因此他們從ostream和is他ream類繼承了公用的重載函數 . 所以在對磁盤文件的操作中 , 可以通過文件流對象和流插入對象運算符 "<<" 和流提取運算符">>"實現對磁盤的讀寫 .
下面我們來舉一個栗子 .
有一個整形術組,含是個元素,從鍵盤輸入10個整數給數組 , 將此數組送到此盤中存放 .
1 #include<fstream> 2 #include<iostream> 3 #include<stdlib.h> 4 using namespace std; 5 int main() 6 { 7 int a[10]; 8 ofstream outfile("e://out_put_file.txt",ios::out); 9 if(!outfile) 10 { 11 cerr<<"open error !"<<endl; 12 exit(1); 13 } 14 cout<<"enter 10 integer numbers :"<<endl; 15 for(int i=0;i<10;i++) 16 { 17 cin>>a[i]; 18 outfile<<a[i]<<" "; 19 } 20 outfile.close(); 21 return 0; 22 }
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 #include<limits.h> 15 #include<fstream> 16 #include<stdlib.h> - // 首先 頭文件不能少 . 17 using namespace std; 18 int main() 19 { 20 int a[10],maxn,i,order; 21 ifstream infile("f:/out_put_file.txt",ios::in); // 現在已經刪除了 nocreate 但是仍然有這個作用 . 22 if(!infile) 23 { 24 cerr<<"open error"<<endl; 25 exit(1); 26 } 27 for(int i=0;i<10;i++) 28 { 29 infile>>a[i]; 30 cout<<a[i]<<" "; 31 } 32 infile.close(); 33 ofstream outfile("f:/out_put_file.txt",ios::out); 34 for(int i=0;i<5;i++) 35 { 36 cin>>a[i]; 37 outfile<<a[i]<<" "; 38 } 39 outfile.close(); 40 cout<<endl; 41 }