1. 程式人生 > >C++的流輸入輸出與C的scanf,printf的區別在哪裡?

C++的流輸入輸出與C的scanf,printf的區別在哪裡?

 我們經常用到的輸入和輸出,都是以終端為物件的,即從鍵盤輸入資料,執行結果輸出到顯示器螢幕上。從作業系統的角度看,每一個與主機相連的輸入輸出裝置都被看作一個檔案。除了以終端為物件進行輸入和輸出外,還經常用磁碟(光碟)作為輸入輸出物件,磁碟檔案既可以作為輸入檔案,也可以作為輸出檔案。

程式的輸入指的是從輸入檔案將資料傳送給程式,程式的輸出指的是從程式將資料傳送給輸出檔案。

C++輸入輸出包含以下三個方面的內容:
  1. 對系統指定的標準裝置的輸入和輸出。即從鍵盤輸入資料,輸出到顯示器螢幕。這種輸入輸出稱為標準的輸入輸出,簡稱標準I/O。
  2. 以外存磁碟檔案為物件進行輸入和輸出,即從磁碟檔案輸入資料,資料輸出到磁碟檔案。以外存檔案為物件的輸入輸出稱為檔案的輸入輸出,簡稱檔案I/O。
  3. 對記憶體中指定的空間進行輸入和輸出。通常指定一個字元陣列作為儲存空間(實際上可以利用該空間儲存任何資訊)。這種輸入和輸出稱為字串輸入輸出,簡稱串I/O。

C++採取不同的方法來實現以上種輸入輸出。為了實現資料的有效流動,C++系統提供了龐大的I/O類庫,呼叫不同的類去實現不同的功能。

在C語言中,用printf和scanf進行輸入輸出,往往不能保證所輸入輸出的資料是可靠的安全的。在C++的輸入輸出中,編譯系統對資料型別進行嚴格的檢查,凡是型別不正確的資料都不可能通過編譯。因此C++的I/O操作是型別安全(type safe)的。
C++的I/O操作是可擴充套件的,不僅可以用來輸入輸出標準型別的資料,也可以用於使用者自定義型別的資料。C++對標準型別的資料和對使用者宣告型別資料的輸入輸出,採用同樣的方法處理。C++通過I/O類庫來實現豐富的I/O功能。C++的輸入輸出優於C語言中的printf和scanf,但是比較複雜,要掌握許多細節。

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++輸人輸出的重要特點之一,它能提高軟體的重用性,加快軟體的開 發過程。