迄今為止,我們討論的輸入輸出是以系統指定的標准設備(輸入設備為鍵盤,輸出設備為顯示器)為對象的。在實際應用中,常以磁盤文件作為對象。即從磁盤文件讀取數據,將數據輸出到磁盤文件。磁盤是計算機的外部存儲器,它能夠長期保留信息,能讀能寫,可以刷新重寫,方便攜帶,因而得到廣泛使用。
文件(file)是程序設計中一個重要的概念。所謂“文件”,一般指存儲在外部介質上數據的集合。一批數據是以文件的形式存放在外部介質(如磁盤、光盤和U盤)上的。操 作系統是以文件為單位對數據進行管理的,也就是說,如果想找存在外部介質上的數據, 必須先按文件名找到所指定的文件,然後再從該文件中讀取數據。要向外部介質上存儲數據也必須先建立一個文件(以文件名標識),才能向它輸出數據。
外存文件包括磁盤文件、光盤文件和U盤文件。目前使用最廣泛的是磁盤文件,為敘述方便,教程中凡用到外存文件的地方均以磁盤文件來代表,在程序中對光盤文件和U盤文件的使用方法與磁盤文件相同。
對用戶來說,常用到的文件有兩大類,一類是程序文件(program file),如C++的源程序文件(.cpp)、目標文件(.obj)、可執行文件(.exe)等。一類是數據文件(data file), 在程序運行時,常常需要將一些數據(運行的最終結果或中間數據)輸出到磁盤上存放起來,以後需要時再從磁盤中輸入到計算機內存。這種磁盤文件就是數據文件。程序中的輸入和輸出的對象就是數據文件。
根據文件中數據的組織形式,可分為ASCII文件和二進制文件。ASCII文件又稱文本(text)文件或字符文件,它的每一個字節放一個ASCII代碼,代表一個字符。二進制文件又稱內部格式文件或字節文件,是把內存中的數據按其在內存中的存儲形式原樣輸出到磁盤上存放。
對於字符信息,在內存中是以ASCII代碼形式存放的,因此,無論用ASCII文件輸出還是用二進制文件輸出,其數據形式是一樣的。但是對於數值數據,二者是不同的。例如有一個長整數100000,在內存中占4個字節,如果按內部格式直接輸出,在磁盤文件中占 4個字節,如果將它轉換為ASCII碼形式輸出,則要占6個字節。
用ASCII碼形式輸出的數據是與字符一一對應的,一個字節代表一個字符,可以直接在屏幕上顯示或打印出來。這種方式使用方便,比較直觀,便於閱讀,便於對字符逐個進行輸入輸出。但一般占存儲空間較多,而且要花費轉換時間(二進制形式與ASCII碼間的轉換)。用內部格式(二進制形式)輸出數值,可以節省外存空間,而且不需要轉換時間,但一個字節並不對應一個字符,不能直接顯示文件中的內容。如果在程序運行過程中有些中間結果數據暫時保存在磁盤文件中,以後又需要輸入到內存的,這時用二進制文件保存是最合適的。如果是為了能顯示和打印以供閱讀,則應按ASCII碼形式輸出。此時得到的是ASCII文件,它的內容可以直接在顯示屏上觀看。
C++提供了低級的I/O功能和高級的I/O功能。高級的I/O功能是把若干個字節組合為一個有意義的單位(如整數、單精度數、雙精度數、字符串或用戶自定義的類型的數據),然後以ASCII字符形式輸入和輸出。例如將數據從內存送到顯示器輸出,就屬於高級I/O功能,先將內存中的數據轉換為ASCII字符,然後分別按整數、單精度數、雙精度數等形式輸出。這種面向類型的輸入輸出在程序中用得很普遍,用戶感到方便。但在傳輸大容量的文件時由於數據格式轉換,速度較慢,效率不高。
所謂低級的I/O功能是以字節為單位輸入和輸出的,在輸入和輸出時不進行數據格式的轉換。這種輸入輸出是以二進制形式進行的。通常用來在內存和設備之間傳輸一批字節。這種輸入輸出速度快、效率高,一般大容量的文件傳輸用無格式轉換的I/O。但使用時會感到不大方便。