c++入門:輸入輸出流

jhcconan614發表於2016-12-26

C語言中I/O存在問題:

1、在C語言中,用printf和scanf進行輸入輸出,往往不能保證所輸入輸出的資料是可靠的、安全的。學過C語言的讀者可以分析下面的用法:想用格式符%d輸出一個整數,但不小心錯用了它輸出單精度變數和字串,會出現什麼情況?假定所用的系統int型佔兩個位元組。

printf(“%d”,i); //i為整型變數,正確,輸出i的值
printf(“%d”,f); //f為單精度變數,輸出變數中前兩個位元組的內容
printf(“%d”,”C++”);//輸出字串”C++”的起始地址
編譯系統認為以上語句都是合法的,而不對資料型別的合法性進行檢查,顯然所得到的結果不是人們所期望的。
2、在用scanf輸入時,有時出現的問題是很隱蔽的。如

scanf(“%d”,&i); //正確,輸入一個整數,賦給整型變數i
scanf(“%d”,i); //漏寫&
假如已有宣告語句”int i=1”,定義i為整型變數,其初值為1。編譯系統不認為上面的scanf語句出錯,而是將輸入的值存放到地址為000001的記憶體單元中,這個錯誤可能產生嚴重的後果。

注意:C++為了與C相容,保留了用printf和scanf進行輸出和輸入的方法,以便使過去所編寫的大量的C程式仍然可以在C++的環境下執行,但是希望讀者在編寫新的C++程式時不要用C的輸入輸出機制,而要用C++自己特有的輸入輸出方法。在C++的輸入輸出中,編譯系統對資料型別進行嚴格的檢查,凡是型別不正確的資料都不可能通過編譯。因此C++的I/0操作是型別安全(typesafe)的。

3、用printf和scanf可以輸出和輸入標準型別(如:int,float,double,char)的資料,但無法輸出使用者自己宣告的型別(如陣列、結構體、類)的資料。在C++中,會經常遇到對類物件的輸入輸出,顯然無法使用printf和scanf來處理。C++的I/O操作是可擴充套件的,不僅可以用來輸入輸出標準型別的資料,也可以用於使用者自定義型別的資料。C++對標準型別的資料和對使用者宣告型別資料的輸入輸出,採用同樣的方法處理。顯然,在使用者宣告瞭一個新類後,是無法用printf和scanf函式直接輸出和輸入這個類的物件的。

輸入和輸出是資料傳送的過程,資料如流水一樣從一處流向另一處。C++形象地將此過程稱為流(stream)。C++的輸入輸出流是指由若干位元組組成的位元組序列,這些位元組中的資料按順序從一個物件傳送到另一物件。流表示了資訊從源到目的端的流動。在輸入操作時,位元組流從輸入裝置(如鍵盤、磁碟)流向記憶體,在輸出操作時,位元組流從記憶體流向輸出裝置(如螢幕、印表機、磁碟等)。流中的內容可以是ASCII字元、二進位制形式的資料、圖形影象、數字音訊視訊或其他形式的資訊。

實際上,在記憶體中為每一個資料流開闢一個記憶體緩衝區,用來存放流中的資料。當用cout和插入運算子“<<”向顯示器輸出資料時,先將這些資料送到程式中的輸出緩衝區儲存,直到緩衝區滿了或遇到endl,就將緩衝區中的全部資料送到顯示器顯示出來。在輸入時,從鍵盤輸入的資料先放在鍵盤緩衝區中,當按Enter鍵時,鍵盤緩衝區中的資料輸入到程式中的輸入緩衝區,形成cin流,然後用提取運算子“>>”從輸入緩衝區中提取資料送給程式中的有關變數。總之,流是與記憶體緩衝區相對應的,或者說,緩衝區中的資料就是流。

在C++中,輸入輸出流被定義為類。C++的I/0庫中的類稱為流類(streamclass)。用流類定義的物件稱為流物件。

前面曾多次說明,cout和cin並不是C++語言中提供的語句,它們是iostream類的物件,在未學習類和物件時,在不致引起誤解的前提下,為敘述方便,把它們稱為cout語句和cin語句。正如C++並未提供賦值語句,只提供賦值表示式,在賦值表示式後面加分號就成了C++的語句,為方便起見,我們習慣稱之為賦值語句。又如,在C語言中常用printf和scanf進行輸出和輸入,printf和scanf是C語言庫函式中的輸入輸出函式,一般也習慣地將由printf和scanf函式構成的語句稱為printf語句和scanf語句。在使用它們時,對其本來的概念要有準確的理解。

例如:
有一元二次方程ax2+bx+c=0,其一般解為 x、1、2= ……但若a=0,或b^2-4ac<0時,用此公式出錯。
程式設計序,從鍵盤輸入a,b,c的值,求x1和x2。如果a=0或b^2-4ac<0,輸出出錯資訊。可寫出以下程式:

#include <iostream>
#include <math.h>
using namespace std;
int main()
{ 
 float a,b,c,disc;
 cout<<"please input a,b,c:";
 cin>>a>>b>>c;
 if (a==0)
      cerr<<"a is equal to zero,error!"<<endl;//將出錯資訊插入cerr,螢幕輸出
 else if ((disc=b*b-4*a*c)<0)
      cerr<<"disc=b*b-4*a*c<0"<<endl; //將出錯資訊插入cerr流,螢幕輸出
 else
 {
      cout<<"x1="<<(-b+sqrt(disc))/(2*a)<<endl;
      cout<<"x2="<<(-b-sqrt(disc))/(2*a)<<endl;
 }
 return 0; 
 }

相關文章