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