對數據文件的操作和文件流


一直到現在,我還是用鍵盤對程序進行輸入,但是實際情況中大部分是對文件進行讀取和輸出,今天就學習一下對文件的輸入輸出  .

根據文件對數據的組織形式 , 可分為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 }

 

 

 

 

 


免責聲明!

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



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