c++的文件输入/输出
1文件的概述
根據(jù)文件中數(shù)據(jù)的組織形式分為:
1 文本文件
文本文件又稱ASCII文件,它的每一個(gè)字節(jié)存放一個(gè)ASCII代碼,代表一個(gè)字符
輸出文本:接收從內(nèi)存輸出的數(shù)據(jù)
輸出文件,向它寫入數(shù)據(jù) ofstream fout;
輸入文件,向它讀取數(shù)據(jù) ifstream fin;
2二進(jìn)制文件
二進(jìn)制文件則是把內(nèi)存中的 數(shù)據(jù),按其在內(nèi)存中的存儲(chǔ)形式原樣寫到磁盤上存放
問題
假定有一個(gè)整數(shù)10000,
(1)按文本形式輸出到磁盤上,需要占多少個(gè)字節(jié)?
答案:需要占5個(gè)字節(jié)
(2)按二進(jìn)制形式輸出到磁盤上有需要占多少個(gè)字節(jié)?
答案:需要占2個(gè)字節(jié)
特點(diǎn)
用文本形式輸出時(shí),一個(gè)字節(jié)對(duì)應(yīng)一個(gè)字符,因而便于對(duì)字符進(jìn)行逐個(gè)處理,也便于輸出字符,缺點(diǎn)是占存儲(chǔ)空間比較多。
用二進(jìn)制形式輸出數(shù)據(jù),可以節(jié)省存儲(chǔ)空間 和轉(zhuǎn)換時(shí)間,但一個(gè)字節(jié) 不能對(duì)應(yīng)一個(gè)字符,不能直接以字符形式輸出。
對(duì)于需要暫時(shí)保存到外存上,以后有需要輸入到內(nèi)存的中間結(jié)果數(shù)據(jù),通常以二進(jìn)制保存。
在c++中進(jìn)行文件操作的一般步驟如下:
(1)為要進(jìn)行操作的文件定義一個(gè)流對(duì)象。
(2)建立或打開文件。如果文件不存在,則建立改文件。如果磁盤上已有該文件,則打開它。
(3)進(jìn)行文件的讀寫操作。在建立或打開文件的基礎(chǔ)上執(zhí)行所要求去的輸入輸出操作。
(4)關(guān)閉文件。當(dāng)完成輸入輸出操作是,應(yīng)把一打開的文件關(guān)閉。
文件的打開與關(guān)閉
1文件的打開
在c++中打開一個(gè)文件,就是講這個(gè)文件與一個(gè)流對(duì)象建立關(guān)聯(lián)。關(guān)閉一個(gè)文件,就是取消這種關(guān)聯(lián)。
(1)使用成員函數(shù)open打開文件
使用成員函數(shù)open()打開文件,也就是使某一指定的磁盤文件與某一已定義的文件流對(duì)象建立關(guān)聯(lián)。
調(diào)用成員函數(shù)open的一般形式為:
文件流對(duì)象.open(文件名路徑,打開方式);
如果省略路徑,則默認(rèn)為當(dāng)前目錄下的文件
(2)打開文件的另一種方法
例如:
ofstream out(″test.dat″);
相當(dāng)于:
ofstream out;
out.open(″test.dat″);
(1)實(shí)際上,文件使用方式有默認(rèn)值:
對(duì)于類ifstream, 默認(rèn)值為ios::in
對(duì)于類ofstream, 默認(rèn)值為ios::out
(2)當(dāng)一個(gè)文件需要用兩種或多種方式打開時(shí),可以用“位或”操作符(即“|”)把幾種方式組合在一起。
例如:
fstream myst;
myst.open(″test.dat″,ios::in|ios::out|ios::binary);
其他例子:
ios::in|ios:out //以輸入和輸出方式打開文件,
//文件可讀可寫
ios::out|ios:binary //以二進(jìn)制方式打開一個(gè)輸出文件
ios::in|ios::binary //以二進(jìn)制方式打開一個(gè)輸入文件
ios::in|ios::nocreate //打開一個(gè)輸入文件,若文件不存在,
//則返回打開失敗的信息
ios::app|ios::nocreate //打開一個(gè)輸出文件,在文件尾接著
//寫數(shù)據(jù),若文件不存在,則返回打開失敗的信息
例 9.11 把字符串“I am a student.”寫入磁盤文件test1.dat中。
#include<iostream> #include<fstream> using namespace std; int main() { // ofstream fout("test1.dat",ios::out); ofstream fout;fout.open("test.dat",ios::out);if(!fout){cout<<"cannot open output file.\n";exit(1);}fout<<"I am a student .";fout.close();return 0; }
例9.12 把磁盤文件test1.dat中的內(nèi)容讀出并顯示在屏幕上。
例9.13把一個(gè)整數(shù)、一個(gè)浮點(diǎn)數(shù)和一個(gè)字符串寫到磁盤文件f1.dat中。
例9.14 先建立一個(gè)輸出文件,向它寫入數(shù)據(jù),然后關(guān)閉文件,再按輸入模式打開它,并讀取信息。
2二進(jìn)制文件的讀寫
任何文件都能以文本方式或二進(jìn)制方式打開
在缺省的情況下,文件用文本方式打開
文本方式和二進(jìn)制方式主要區(qū)別是:
在文本方式下輸入時(shí),回車和換行兩個(gè)字符要轉(zhuǎn)換為字符“\n”,再輸入時(shí),字符“\n”轉(zhuǎn)換為回車和換行兩個(gè)字符。這些轉(zhuǎn)換在二進(jìn)制方式下是不進(jìn)行的。
二進(jìn)制文件進(jìn)行讀寫有兩種方式:
(1)使用的是函數(shù)get()和put();
get函數(shù)是輸入流類istream中定義的成員函數(shù),它可以從與流對(duì)象鏈接的文件中讀出數(shù)據(jù),每次讀出一個(gè)字節(jié)(字符)。
put函數(shù)是輸出流類ostream中的成員函數(shù),它可以與流對(duì)象連接的文件中寫入數(shù)據(jù),每次寫入一個(gè)字節(jié)(字符)。
例9.15 將’a’ 至’z’ 的26個(gè)英文字母寫入文件,而后從該文件中讀出并顯示出來(lái)。
(2)使用的是函數(shù)read()和write();
C++提供了兩個(gè)函數(shù)read和write,用來(lái)讀寫一個(gè)數(shù)據(jù)塊,
read函數(shù)最常用的調(diào)用格式如下:
*inf.read(char buf,int len)
inf是輸入文件流對(duì)象
第1個(gè)參數(shù)buf:是一個(gè)指針,它指向讀入數(shù)據(jù)所存放的內(nèi)存空間的起始地址;
第2個(gè)參數(shù)len:是一個(gè)整數(shù)值,它是要讀入的數(shù)據(jù)的字節(jié)數(shù)。
功能:從與輸入文件流對(duì)象inf相關(guān)聯(lián)的磁盤文件中,讀取len個(gè)字節(jié)(或遇EOF結(jié)束),并把它們存放在字符指針buf所指的一段內(nèi)存空間內(nèi)。如果在len個(gè)字節(jié)(字符)被讀出之前就達(dá)到了文件尾,則read函數(shù)停止執(zhí)行。
write函數(shù)最常用的調(diào)用格式如下:
outf.write(const char*buf,int len)
outf是輸出文件流對(duì)象
第1個(gè)參數(shù)buf:是一個(gè)指針,它指向讀入數(shù)據(jù)所存放的內(nèi)存空間的起始地址;
第2個(gè)參數(shù)len:是一個(gè)整數(shù)值,它是要讀入的數(shù)據(jù)的字節(jié)數(shù)。
功能: 將字符指針buf所給出的地址開始的len個(gè)字節(jié)的內(nèi)容不加轉(zhuǎn)換地寫到與輸出文件流對(duì)象outf相關(guān)聯(lián)的磁盤文件中。
注意:第1個(gè)參數(shù)的數(shù)據(jù)類型為 char*,如果是其他類型的數(shù)據(jù),必須進(jìn)行類型轉(zhuǎn)換,例如:
int array[]={50,60,70};
read((char*)& array,sizeof (array));
例9.17 將例9.16以二進(jìn)制形式存放在磁盤文件中的數(shù)據(jù)(兩門課程的課程名和成績(jī))讀入內(nèi)存,并在顯示器上顯示。
這四種函數(shù)也可以用于文本問價(jià)你的讀寫。
除字符轉(zhuǎn)換方面略有差別外,文本文件的處理過程與二進(jìn)制文件的處理過程基本相同。
(3) 檢測(cè)文件結(jié)束
在文件結(jié)束的地方有一個(gè)標(biāo)志位,記為EOF(end of file)。使用成員函數(shù)eof(),可以檢測(cè)到這個(gè)結(jié)束符。該函數(shù)的原型是:
函數(shù)eof()的用法示例如下:
(1)檢測(cè)是否到達(dá)文件尾, 如果該函數(shù)的返回值非零,表示到達(dá)文件尾。返回值為零表示未到達(dá)文件尾。
ifstream ifs;
…
if (!ifs.eof()) … //尚未到達(dá)文件尾
(2) 檢測(cè)流對(duì)象是否為零,為零表示文件結(jié)束:
ifstream ifs;
…
if(!ifs) … //尚未到達(dá)文件尾
例如 在例9.1中使用了以下檢測(cè)流對(duì)象到達(dá)末尾的方法:
while(cin.get(ch))
cout.put(ch);
說(shuō)明:當(dāng)從鍵盤上輸入字符時(shí),其結(jié)束符是ctrl_z,也就是說(shuō),按下ctrl_z,eof()函數(shù)返回的值為真。
(4)二進(jìn)制數(shù)據(jù)文件的隨機(jī)讀寫
按一定順序進(jìn)行讀寫的文件稱為順序文件。
順序文件只能按實(shí)際排列的順序,一個(gè)一個(gè)地訪問文件中的各個(gè)元素。
在類istream及類ostream中定義了幾個(gè)與讀或?qū)懳募羔樝嚓P(guān)的成員函數(shù),使我們可以在輸入輸出流內(nèi)隨機(jī)移動(dòng)文件指針,從而可以對(duì)文件的數(shù)據(jù)進(jìn)行隨機(jī)讀寫。
例9.15 有3門課程的數(shù)據(jù),要求:
(1)以讀寫方式打開一個(gè)磁盤文件,并把這些數(shù)據(jù)存到磁盤文件中;
(2)將文件指針定位到第3門課程,讀取第3門課程的數(shù)據(jù)并顯示出來(lái);
(3)將文件指針定位到第1門課程,讀取第1門課程的數(shù)據(jù)并顯示出來(lái);
(4)將文件指針從當(dāng)前位置定位到下一門課程,讀取該門課程的數(shù)
據(jù)并顯示出來(lái)。
總結(jié)
以上是生活随笔為你收集整理的c++的文件输入/输出的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发朋友圈各种糊和马赛克微信朋友圈马赛克
- 下一篇: c++的STL