C++的流輸入輸出與C的scanf,printf的區別在哪裡?
程式的輸入指的是從輸入檔案將資料傳送給程式,程式的輸出指的是從程式將資料傳送給輸出檔案。
C++輸入輸出包含以下三個方面的內容:
- 對系統指定的標準裝置的輸入和輸出。即從鍵盤輸入資料,輸出到顯示器螢幕。這種輸入輸出稱為標準的輸入輸出,簡稱標準I/O。
- 以外存磁碟檔案為物件進行輸入和輸出,即從磁碟檔案輸入資料,資料輸出到磁碟檔案。以外存檔案為物件的輸入輸出稱為檔案的輸入輸出,簡稱檔案I/O。
- 對記憶體中指定的空間進行輸入和輸出。通常指定一個字元陣列作為儲存空間(實際上可以利用該空間儲存任何資訊)。這種輸入和輸出稱為字串輸入輸出,簡稱串I/O。
C++採取不同的方法來實現以上種輸入輸出。為了實現資料的有效流動,C++系統提供了龐大的I/O類庫,呼叫不同的類去實現不同的功能。
在C語言中,用printf和scanf進行輸入輸出,往往不能保證所輸入輸出的資料是可靠的安全的。在C++的輸入輸出中,編譯系統對資料型別進行嚴格的檢查,凡是型別不正確的資料都不可能通過編譯。因此C++的I/O操作是型別安全(type safe)的。
C++的I/O對C的發展--型別安全和可擴充套件性
在C語言中,用primf和scanf進行輸人輸出,往往不能保證所輸入輸出的資料是可靠的、安全的。學過C語言的讀者可以分析下面的用法,想用格式符%d輸出一個整數, 但不小心用它輸出了單精度變數和字串,會出現什麼情況?假定所用的系統int型佔兩個位元組。
printf("%d", i); // i為整型變數,正確,輸出i的值
printf("%d", f); // f為單精度變數,輸出f變數中前兩個位元組的內容
printf("%d", "C++"); //輸出宇符串"C++"的地址
編譯系統認為以上語句都是合法的,而不對資料型別的合法性進行檢查,顯然所得到的結果不是人們所期望的,在用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/O操作是型別安全(type safe)的。
此外,用printf和scanf可以輸出和輸入標準型別的資料(如int、float、double、char), 但無法輸出使用者自己宣告的型別(如陣列、結構體、類)的資料。在C++中,會經常遇到對類物件的輸人輸出,顯然無法使用printf和scanf來處理。C++的I/O操作是可擴充套件 的,不僅可以用來輸人輸出標準型別的資料,也可以用於使用者自定義型別的資料。C++對標準型別的資料和對使用者宣告型別資料的輸人輸出,採用同樣的方法處理。顯然,在使用者聲明瞭一個新類後,是無法用printf和scanf 函式直接輸出和輸人這個類的物件的。
可擴充套件性是C++輸人輸出的重要特點之一,它能提高軟體的重用性,加快軟體的開 發過程。