輸入輸出流(二)

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的工作方式。

 

發佈了208 篇原創文章 · 獲贊 31 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章