1、流成員函數
1)put 和get
ostream類除了提供上面介紹過的用於格式控制的成員函數外,還提供了專用於輸出單個字符的成員函數put。如cout.put(′a′);put函數的參數可以是字符或字符的ASCII代碼(也可以是一個整型表達式)。可以在一個語句中連續調用put函數。如cout.put(71).put(79).pu(79).put(68).put(′\\n′);putchar函數是C語言中使用的,在stdio.h頭文件中定義。C++保留了這個函數,在iostream頭文件中定義。
流提取符“>>”從流中提取數據時通常跳過輸入流中的空格、tab鍵、換行符等空白字符。 注意: 只有在輸入完數據再按回車鍵後,該行數據才被送入鍵盤緩衝區,形成輸入流,提取運算符“>>”才能從中提取數據。需要注意保證從流中讀取數據能正常進行。
除了可以用cin輸入標準類型的數據外,還可以用istream類流對象的一些成員函數,實現字符的輸入。用get函數讀入一個字符。
(1) 不帶參數的get函數
其調用形式爲
cin.get()
用來從指定的輸入流中提取一個字符,函數的返回值就是讀入的字符。若遇到輸入流中的文件結束符,則函數值返回文件結束標誌EOF(End Of File) 。C語言中的getchar函數與流成員函數cin.get( )的功能相同,C++保留了C的這種用法。
(2) 有一個參數的get函數
其調用形式爲
cin.get(ch)
其作用是從輸入流中讀取一個字符,賦給字符變量ch。如果讀取成功則函數返回非0值(真),如失敗(遇文件結束符) 則函數返回0值(假)。
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
int main()
{
char c;
cout<<"enter a sentence:"<<endl;
while(cin.get(c))
{
cout.put(c);
}
cout<<"end"<<endl;
return 1;
}
(3) 有3個參數的get函數
其調用形式爲
cin.get(字符數組,字符個數n,終止字符) 或
cin.get(字符指針,字符個數n,終止字符)
其作用是從輸入流中讀取n-1個字符,賦給指定的字符數組(或字符指針指向的數組),如果在讀取n-1個字符之前遇到指定的終止字符,則提前結束讀取。如果讀取成功則函數返回非0值(真),如失敗(遇文件結束符) 則函數返回0值(假)。
2)用成員函數getline函數讀入一行字符
getline函數的作用是從輸入流中讀取一行字符,其用法與帶3個參數的get函數類似。即
cin.getline(字符數組(或字符指針),字符個數n,終止標誌字符)
3) eof函數
eof是end of file的縮寫,表示“文件結束”。從輸入流讀取數據,如果到達文件末尾(遇文件結束符),eof函數值爲非零值(表示真),否則爲0(假)。
4)peek函數
peek函數的作用是觀測下一個字符。其調用形式爲
c=cin.peek( );cin.peek
函數的返回值是指針指向的當前字符,但它只是觀測,指針仍停留在當前位置,並不後移。如果要訪問的字符是文件結束符,則函數值是EOF(-1)。
5)putback函數,其調用形式爲
cin.putback(ch);
其作用是將前面用get或getline函數從輸入流中讀取的字符ch返回到輸入流,插入到當前指針位置,以供後面讀取。
#include <iostream>
using namespace std;
int main( )
{char c[20];
int ch;
cout<<"please enter a sentence:"<<endl;
cin.getline(c,15,'/');
cout<<"The first part is:"<<c<<endl;
ch=cin.peek( );//觀看當前字符
cout<<"The next character(ASCII code) is:"<<ch<<endl;
cin.putback(c[0]); //將′I′插入到指針所指處
cin.getline(c,15,'/');
cout<<"The second part is:"<<"OK To C"<<c<<endl;
return 0;
}
6)ignore函數
其調用形式爲
cin,ignore(n, 終止字符)
函數作用是跳過輸入流中n個字符,或在遇到指定的終止字符時提前結束(此時跳過包括終止字符在內的若干字符)。如
ighore(5, ′A′)//跳過輸入流中5個字符,遇′A′後就不再跳了
也可以不帶參數或只帶一個參數。如
ignore( )(n默認值爲1,終止字符默認爲EOF)
相當於
ignore(1,EOF)
2、文件I/O
所謂“文件”,一般指存儲在外部介質上數據的集合。一批數據是以文件的形式存放在外部介質上的。操作系統是以文件爲單位對數據進行管理的。
外存文件包括磁盤文件、光盤文件和U盤文件。目前使用最廣泛的是磁盤文件。對用戶來說,常用到的文件有兩大類,一類是程序文件(program file)。一類是數據文件(data file)。程序中的輸入和輸出的對象就是數據文件。根據文件中數據的組織形式,可分爲ASCII文件和二進制文件。
對於字符信息,在內存中是以ASCII代碼形式存放的,因此,無論用ASCII文件輸出還是用二進制文件輸出,其數據形式是一樣的。但是對於數值數據,二者是不同的。例如有一個長整數100000,在內存中佔4個字節,如果按內部格式直接輸出,在磁盤文件中佔4個字節,如果將它轉換爲ASCII碼形式輸出,則要佔6個字節。
C++提供低級的I/O功能和高級的I/O功能。高級的I/O功能是把若干個字節組合爲一個有意義的單位,然後以ASCII字符形式輸入和輸出。所謂低級的I/O功能是以字節爲單位輸入和輸出的,在輸入和輸出時不進行數據格式的轉換。
文件流是以外存文件爲輸入輸出對象的數據流。輸出文件流是從內存流向外存文件的數據,輸入文件流是從外存文件流向內存的數據。每一個文件流都有一個內存緩衝區與之對應。
文件流本身不是文件,而只是以文件爲輸入輸出對象的流。若要對磁盤文件輸入輸出,就必須通過文件流來實現。在C++的I/O類庫中定義了幾種文件類,專門用於對磁盤文件的輸入輸出操作。
要以磁盤文件爲對象進行輸入輸出,必須定義一個文件流類的對象,通過文件流對象將數據從內存輸出到磁盤文件,或者通過文件流對象從磁盤文件將數據輸入到內存。正如以標準設備爲對象的輸入輸出中,cin,cout就是流對象,C++是通過流對象進行輸入輸出的。
1)文件的打開與關閉
文件流可分別對於ifstream 類,ofstream 類和fstream 類說明其對象的方式創建。三個類的構造函數爲:
ifstream::ifstream(char * name,int mode=ios::in,int file_attrb =filebuf::openprot);
ofstream::ofstream(char * name,int mode=ios::out,int file_attrb =filebuf::openprot);
fstream::fstream(char * name,int mode,int file_attrb =filebuf::openprot);
//其中openprot=0
第一個參數爲文件名字符串(包括路徑)。
第二個參數爲對文件進行的I/O 模式,其值已在ios 中以枚舉方式定義:
enum open-mode{
in=0x01 //用於讀入
out=0x02 //用於寫出
ate=0x04 //打開並指向文件尾
app=0x08 //用於附加數據打開並指向文件尾
trunc=0x10 //如文件存在則清除其內容
nocreate=0x20 //如文件不存在,則操作失敗
noreplace=0x40 //如文件存在,則操作失敗
binary=0x80 //二進制(非文本)文件
};
參數mode 可缺省,文件流爲輸入文件流時,其缺省值爲in;爲輸出文件
流時,缺省值爲out。
第三個參數爲文件屬性(可以缺省),其類型值在filebuf 類中定義,其值
爲:
普通文件 0
只讀文件 1
隱藏文件 2
系統文件 4
檔案文件 8
例如,創建一個輸出文件流並輸出一串字符可寫爲:
# include<fstream.h>
void main(){
ofstream output("hello.dat");
output<<"Hello world!"<<endl;
}
C++的I/O 系統爲了適應用戶的習慣,也提供open 函數和close 函數來完成上述工作,其方式是:用open()和close()來代替構造函數和析構函數。其方法是:
# include<fstream.h>
void main(){
ofstream output;
output.open<<("hello.dat");
output<<"Hello world!"<<endl;
output.close();
}
open 函數的參數與上面關於構造函數的說明一致。
參數中的文件名name 亦可選用設備文件名:
CON:指輸入時的鍵盤,輸出時的顯示器。
CPT1:指輸出的打印機。
COM1,COM2:可用於I/O 的串行口1,2。
使用方法與上面的一致,例如可定義打印機輸出流:
ofstream prt("LPT1");
prt<<"to printer"<<endl;
如果把流prt(的地址)賦給流cout:
cout=prt;
則流cout 不再與顯示器而是與打印機相連,這時,
cout<<"Hello world!"<<endl;
可由打印機輸出。
下面介紹一下Open和Close的用法。
A)打開磁盤文件
打開文件是指在文件讀寫之前做必要的準備工作,包括:
(1) 爲文件流對象和指定的磁盤文件建立關聯,以便使文件流流向指定的磁盤文件。(2) 指定文件的工作方式。以上工作可以通過兩種不同的方法實現。
- (a)調用文件流的成員函數open。如
ofstream outfile;//定義ofstream類(輸出文件流類)對象outfile
outfile.open(″f1.dat″,ios::out); //使文件流與f1.dat文件建立關聯
調用成員函數open的一般形式爲
文件流對象.open(磁盤文件名,輸入輸出方式);
磁盤文件名可以包括路徑,如″c:\\new\\f1.dat″,如缺省路徑,則默認爲當前目錄下的文件。
- (b)在定義文件流對象時指定參數
在聲明文件流類時定義了帶參數的構造函數,其中包含了打開磁盤文件的功能。因此,可以在定義文件流對象時指定參數,調用文件流類的構造函數來實現打開文件的功能。如
ostream outfile(″f1.dat″,ios::out);
說明:每一個打開的文件都有一個文件指針;可以用“位或”運算符“|”對輸入輸出方式進行組合;如果打開操作失敗,open函數的返回值爲0(假),如果是用調用構造函數的方式打開文件的,則流對象的值爲0。
B)關閉磁盤文件
關閉文件用成員函數close。如
outfile.close( );//將輸出文件流所關聯的磁盤文件關閉
關閉,就是解除該磁盤文件與文件流的關聯,原來設置的工作方式也失效。此時可以將文件流與其他磁盤文件建立關聯,通過文件流對新的文件進行輸入或輸出。如outfile.open(″f2.dat″,ios::app|ios::nocreate);
此時文件流outfile與f2.dat建立關聯,並指定了f2.dat的工作方式。