c++入門:輸入輸出流
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;
}
相關文章
- [C++]輸入/輸出流類庫C++
- C++中的檔案輸入/輸出(3):掌握輸入/輸出流 (轉)C++
- 輸入輸出流
- Java 輸入輸出流Java
- JAVA輸入輸出流Java
- 【C++】輸入輸出C++
- C++ 中輸入輸出流及檔案流操作筆記C++筆記
- C++格式化輸入輸出C++
- IO流的位元組輸入輸出流(InputStream,OutputStream)
- 重學java中的輸入輸出流Java
- Nucleo入門--004通用輸入輸出
- 輸入輸出
- 詳解Java中的IO輸入輸出流!Java
- Java中資料輸入輸出流——DataInputStream和DataOutputStreamJavaAI
- java中基本輸入輸出流的解釋Java
- [java IO流]之 基本資料型別輸入輸出流Java資料型別
- 【C++】標準檔案的輸入輸出!!!C++
- C++中的檔案輸入/輸出(4):檢測輸入/輸出的狀態標誌 (轉)C++
- 檔案輸入輸出處理(二)-位元組流
- [java IO流]之 鍵盤顯示器輸入輸出流(System)Java
- C++ 學習筆記之——輸入和輸出C++筆記
- C++輸入輸出常用格式(cin,cout,stringstream)C++
- 【Java基礎知識】IO流--標準輸入輸出流、列印流PrintStreamJava
- C++ 資料輸入cin (解決CLoin輸入中文程式出錯)C++
- 輸入輸出系統
- mybatis入門基礎(四)----輸入對映和輸出對映MyBatis
- C++名稱空間、標準輸入輸出、引用C++
- 執行緒間的協作(3)——管道輸入/輸出流執行緒
- linux中的輸入與輸出管理(重定向輸入,輸出,管道符)Linux
- 資料的輸入輸出
- Java —— 標準輸入輸出Java
- 排序,檔案輸入輸出排序
- 03 資料輸入-輸出
- Python 輸入和輸出Python
- Python的輸入輸出Python
- 檔案操作-輸入輸出
- C語言輸入輸出C語言
- Java基礎輸入輸出Java