程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C++的文件操作

C++的文件操作

編輯:關於C語言

很多人在C++編程中習慣使用ANSI C下的文件類型指針FILE來執行文件的有關操作,這難免影響C++程序的總體美觀性。另外,C++標准IO庫中提供了更為完善、易用的文件操作方法,所以建議使用標准庫來實現文件的輸入/輸出,培養一種好的編程習慣。

1.文件的輸入輸出

文件操作的頭文件有:ifstream提供文件讀取功能;ofstream提供文件寫入功能;fstream提供文件的讀寫功能(包括了前兩類的功能,實現對同一文件的讀寫雙操作)。
a.定義對象

ifstream infile; 
ofstream outfile; 
b.在使用fstream對象之前,還必須使這些對象綁定要讀寫的文件
infile.open (); 
outfile.open (); 
當然,fstream類提供了構造函數,可以在定義對象時初始化實現上述兩步
ifstream infile (); 
ofstream outfile (); 
c.檢查文件打開是否成功
 (!<<  << -
d.文件內容的處理
I.成員函數eof()用來檢測是否到達文件尾,如果到達文件尾返回非0值,否則返回0
(!
II.文件分為文本文件和二進制文件,對文本文件的處理比較簡單,用插入器和析取器就可以了;而對於二進制的處理要復雜些,下要分別介紹這兩種方式
文本文件:用插入器(<<)向文件輸出;用析取器(>>)從文件輸入。假設infile以輸入方式打開,outfile以輸出打開
outfile<<>>word; 

這種方式還有一種簡單的格式化能力,比如可以指定輸出為16進制等等
操縱符 功能 輸入/輸出 dec 格式化為十進制數值數據 輸入和輸出 hex 格式化為十六進制數值數據 輸入和輸出 oct 格式化為八進制數值數據 輸入和輸出 setpxecision(int p) 設置浮點數的精度位數 輸出 endl 輸出一個換行符並刷新此流 輸出 ends 輸出一個空字符 輸出

比如要把123當作十六進制輸出:outfile<<hex<<123;要把3.1415926以5位精度輸出:outfile<<setpxecision(5)<<3.1415926
getline函數,輸入文件的一行,函數原型

istream& getline (istream& , & str, & getline (istream& , & str);

從 is 中讀取字符串存入 str 中,直到遇到分隔符delim為止。對於第二種形式,getline遇到 '\n’ 停止。執行過程中,如果delim出現,它會被讀取並丟棄,下次輸入將在它之後開始。
二進制文件:put()函數向流寫入一個字符,其原型是ofstream &put(char ch),使用也比較簡單,如outfile.put('c');就是向流寫一個字符'c'。
get()函數比較靈活,有3種常用的重載形式:
一種就是和put()對應的形式:ifstream &get(char &ch);功能是從流中讀取一個字符,結果保存在引用ch中,如果到文件尾,返回空字符。如infile.get(x);表示從文件中讀取一個字符,並把讀取的字符保存在x中。
另一種重載形式的原型是: int get();這種形式是從流中返回一個字符,如果到達文件尾,返回EOF,如x=file2.get();和上例功能是一樣的。
還有一種形式的原型是:ifstream &get(char *buf,int num,char delim=' ');這種形式把字符讀入由 buf 指向的數組,直到讀入了 num 個字符或遇到了由 delim 指定的字符,如果沒使用 delim 這個參數,將使用缺省值換行符' '。
讀寫二進制數據塊,要使用成員函數read()和write()成員函數,它們原型如下:

read (unsigned  *buf,  unsigned  *buf,  num);

III.文件的定位,C++的文件定位分為讀位置和寫位置的定位,對應的成員函數是 seekg()和 seekp(),seekg()是設置讀位置,seekp是設置寫位置。它們最通用的形式如下:

istream &&seekp (streamoff offset, seek_dir origin);

offset定義了偏移量,seek_dir 表示移動的基准位置,是一個有以下值的枚舉:
ios::beg: 文件開頭
ios::cur: 文件當前位置
ios::end: 文件結尾
這兩個函數一般用於二進制文件(字節),因為文本文件會因為系統對字符的解釋而可能與預想的值不同。

file1.seekg (,ios::cur); 
file2.seekp (,ios::beg); 

e.文件關閉
程序結束或fstream對象與另一文件關聯時,必須先關閉現在的文件。

infile.close(); 

2.文件模式

在打開文件時,無論是調用open還是以文件名作為流初始化的一部分,都需要指定文件模式。文件流構造函數和open函數都提供了默認參數來設置文件模式,默認值因流類型的不同而不同。常用的文件模式與含義如下:
文件模式 含義 in 打開文件作讀操作 out 打開文件作寫操作 app 在每次寫之前找到文件尾 ate 打開文件時把文件定位在文件尾 trunc 打開文件時清空已存在的文件流 binary 以二進制模式進行IO操作

以binary模式打開的流將文件以字節序列的形式處理,而不解釋流中的字符。
默認情況下,與ifstream流對相關聯的文件以in模式打開,與ofstream關聯文件以out模式打開。以out模式打開的文件會被清空,丟棄該文件存儲的所有數據,從效果來看,為ofstream對象指定out模式等效於指定了out和trunc模式。
模式的組合,多個文件模式可以同時指定,但是有些組合是沒有意義的,常見的組合模式如下
組合模式 含義 out | app 打開文件做寫操作,文件尾寫入 out | trunc 打開文件做寫操作,刪除文件已有數據(與out相同) in | out 打開文件做讀、寫操作,定位到文件開頭處 in | out | trunc 打開文件做讀、寫操作,刪除文件中已有數據 in | out | ate 打開文件做讀、寫操作,定位到文件末尾處 …… ……

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved