Fortran程式設計第16章資料檔案的管理

2021-08-13 13:08:47 字數 4697 閱讀 7751

第16章資料檔案的管理

固然,我們編制乙個科學計算程式的目的是執行給定的計算,是描述乙個通過演算法而實現的對輸入資料的計算的過程,而不只是簡單的對資料的處理,但是這並不妨礙我們從資訊處理的角度來看待這個過程。因為任何的計算,再簡單也必定包含資料的輸入與輸出過程,更複雜的計算程式則還包含資料的快取管理,不同程式單位之間的資料傳遞,特別是在程式的計算涉及到龐大的資料量時,例如在工程計算中常見的大陣列等,更加不能依靠單純的變數來管理龐大的資料量。

實際上分析一下我們自己進行計算的情形,就知道在計算過程當中進行資料管理同樣是一件非常重要的事務,而按照計算機的從馮紐曼時代就已經給予奠基的基本模型來看,一台計算機的有效工作,依賴於指令流與資料流的有機合作,因此fortran語言除了要描述計算,還要能夠描述對於資料流的管理。

在前面我們已經討論了fortran程式的內部通訊問題,那種通訊完全是依賴變數機制來進行的,因為那種通訊都是緊密關聯於計算的通訊,直接在變數之間進行資料值的交換能夠保證計算的效率和速度。但是一旦計算所涉及的資料量非常龐大,而計算過程對於資料的輸入與輸出要求更加複雜時,變數機制就不足以承擔資料處理的功能,因此fortran提供了單獨的輸入輸出語句以及檔案的概念,來實現對資料流的輸入輸出的管理。

除了作為面向程式自身的資料輸入輸出管理的功能之外,乙個fortran程式的完整執行還必須包括程式與人的互動,而一旦涉及到機器與人的互動,自然要求任何資料都必須以適宜於人的辨識與處理的格式出現於一定的物理媒質上,這就是輸入與輸出的編輯問題,將是下章所要討論的內容,本章則只說明fortran所提供的輸入輸出處理語句。

fortran用於處理與管理輸入輸出資料的語句分為如下四大類:

● 檔案聯結語句。

包括open語句和close語句。

● 資料傳輸語句。

這一類語句又可以分為2個小類別:

● 據傳輸輸入語句,包括read語句。

● 據傳輸輸出語句,包括write語句和print語句。

● 檔案定位語句。

包括backspace語句,endfile語句以及rewind語句。

● 檔案查詢語句。

包括inquire語句。

這些語句所要實現的首要的功能,就是控制資料的輸入與輸出,即資料從外部媒質到記憶體,或從內部檔案到記憶體的輸入,以及資料從記憶體到外部媒質,或從記憶體到內部檔案的輸出。然後就是輔助性的用來操縱外部媒質,以及描述或查詢檔案與外部媒質的聯結屬性的功能。下面在給出fortran管理資料輸入輸出的一般概念之後,再分別詳細討論這些語句。

16.1 輸入輸出管理的資料單位

fortran對於輸入輸出資料進行管理的基本單位概念是紀錄以及紀錄組成的檔案,因此下面我們分別討論紀錄與檔案概念。

16.1.1 紀錄

fortran的變數一次只能儲存乙個資料值,顯然不足以用來進行有效的資料管理,因此fortran建立了專門的用來有組織地儲存任意數量的資料的概念,即檔案。

檔案由乙個紀錄的序列組成,而紀錄是一種邏輯形式上的單位,可以是終端或列印輸出上顯示的一行,也可以是外部儲存器上的乙個邏輯紀錄,儘管紀錄總是與各種物理形式的資料單位保持一定的對應,但實際上是與具體的物理表現形式無關的,因為紀錄本質上是乙個語法上的概念。實際上在fortran裡面並不存在物理紀錄的概念。

組成乙個檔案的紀錄從語法地位上分為如下兩種:

● 資料紀錄;

● 檔案終止紀錄。

所謂資料紀錄就是作為檔案的資料內容的紀錄,而檔案終止紀錄則純粹是乙個語法意義上的紀錄,它不包含任何資料內容,只是用來標誌乙個檔案的終止。因此檔案終止紀錄只能用作檔案的最後乙個紀錄,並且沒有長度的屬性。

由於計算機本質上的序列工作模式,紀錄同樣是乙個序列序列的結構,該序列的單位就是資料值,即乙個資料值的序列組成乙個紀錄。

對於資料紀錄來說,其中的資料值可以有如下兩種表示形式:

● 無格式資料;

● 格式化資料。

所謂資料的是否具有格式,完全是針對人而言的,即具有格式的資料就是把資料轉化為便於人的閱讀的字元型資料表示形式,也就是文字與數字,或者說ascii編碼形式;而所謂無格式資料就是fortran程式自身所實際處理的資料的在物理層面上的表示形式,一般都是二進位制表示的數字形式。對於計算機來說,世界上的任何形式的資訊,終歸都要表示為這種形式的資料。

乙個fortran程式所涉及到的任何資料,在該程式執行時,無論是作為執行的結果還是作為執行的初始值,它寫入到記憶體當中,或從記憶體當中讀出,或者是從記憶體到硬碟的輸入輸出,資料流裡面的資料都是無格式資料。

而一旦資料需要人的閱讀,就必須把二進位制資料形式轉換為能夠被人閱讀的字元形式,實際上我們編寫的原始碼就是這種形式的資料。

乙個資料紀錄或者完全由無格式的資料組成,稱為無格式紀錄;或者完全由格式化資料組成,稱為格式化紀錄。

無格式紀錄完全只是在機器內部存在,它的具體的資料形式是由系統決定的,最常見的就是二進位制形式。這種紀錄完全不需要人的監視與閱讀,而格式化紀錄則完全是人用來給機器輸入資料,或機器向人展示資料結果的資料紀錄形式,因此當人向機器輸入格式化紀錄後,機器必須再把它翻譯為無格式的紀錄,才能被程式所使用,反之亦然。

格式化紀錄的好處就是便於人的閱讀,它只能通過格式化輸入輸出語句來讀或寫;而無格式的紀錄的特點就是能夠直接得到機器的處理,相應的它也只能通過無格式的輸入輸出語句來讀或寫。

對於紀錄可以定義長度的概念。格式化紀錄的長度就是其所包含的字元的數目;而無格式紀錄的長度同樣用來計量其中資料量的大小,它的具體度量方法的定義則依賴於具體的處理器系統對於資料量單位的定義。格式化紀錄和無格式紀錄的長度都可以為0。

除了包含資料值的紀錄之外,還有檔案終止紀錄。由於它只是起檔案終止的語法標誌作用,因此它不包含任何資料,所以它的長度也就是0。

乙個檔案至多只能包含乙個檔案終止紀錄,並且只能是檔案的最後乙個紀錄。檔案終止紀錄可以有如下幾種生成方式:

● 可以通過檔案的序列訪問,最後用乙個endfile語句顯式地寫下來;

● 也可以通過檔案定位語句,如rewind語句或backspace語句,而隱式地寫下來;

● 運用close語句關閉檔案或部件,或者是正常地終止程式,或者是對同乙個部件使用了另外乙個open語句,從而隱式地寫下來。

從上面的檔案終止紀錄的實現方式可以看出,這種紀錄並不需要任何實際的物理實現。

16.1.2 檔案

乙個紀錄的序列構成乙個檔案。

在程式執行的任何時候,對於乙個給定的檔案,它的訪問方法,形式,操作以及紀錄的長度,都明確地存在相應的依賴於系統的合法性規定,同時檔案也可以具有字串型別的名稱,即所謂命名檔案,不過對於該名稱所使用的字元形式或長度,都是由具體的系統來規定,以便與相應作業系統對於檔案的命名約定保持一致。

按照檔案與程式的功能關係以及儲存性質,檔案可以分為如下兩種:

● 內部檔案;

● 外部檔案。

所謂內部檔案儲存在程式可以訪問的記憶體空間裡面,而外部檔案則儲存在系統的外部儲存部件上,例如硬碟。這種儲存位置的不同實際上也反映了它們對於程式的不同功能,因為這兩種儲存空間的物理效能差異決定了它們對於cpu是具有不同意義的。

外部檔案與內部檔案的這種不同功能意義體現在如下幾個不同的方面:

● 檔案的存在性。

對於外部檔案來說,程式需要訪問的乙個外部檔案可能是存在的,也可能是不存在的,都是合法的程式執行現象。例如inquire語句,open語句,close語句,write語句,print語句,rewind語句,以及endfile語句都可以引用乙個並不存在的檔案;而如果使用write語句,print語句,或endfile語句來引用乙個預聯結的並不存在的語句,就自然地能夠生成該檔案。

乙個外部檔案的不存在也可能是**於系統對於硬碟空間的許可權限制,例如對於乙個

fortran應用程式來說,系統檔案以及fortran編譯器程式檔案都不應該被訪問。

而對於程式來說,它所涉及的內部檔案則都必須存在於相應的記憶體空間裡面。

● 程式對外部檔案的訪問需要通過與邏輯部件建立聯結,因此就需要相應的能夠對外部檔案進行聯結,定位與查詢的語句,而對於內部檔案則不需要這些語句功能。同時這種聯結就使得外部檔案具有定位的屬性。

● 對於外部檔案來說,它的訪問方式,合法形式,合法操作,以及合法紀錄長度等都不是由fortran語言標準來規定,而是由作業系統對於檔案的約定以及使用者的特定選擇來決定的;而內部檔案的內容都是作為預設字元型變數的資料值的形式而儲存的,這些字元型資料值都是程式的通常的賦值過程所產生的,或者是輸出語句針對變數而給出的。

如果內部檔案所表示的變數是乙個標量,那麼該檔案就只有乙個紀錄;如果該變數是乙個陣列,那麼該陣列的每乙個元素組成該檔案的乙個紀錄,檔案裡面紀錄的順序就是陣列的相應的元素順序,每個紀錄的長度就是相應元素的長度。

16.1.3 檔案的訪問

由於檔案的紀錄是一種序列的序列結構,要實現對檔案的紀錄的訪問,可以有如下兩種方式:

● 序列訪問;

● 直接訪問。

所謂序列訪問,就是順著檔案的紀錄序列來訪問特定的紀錄,即如果要訪問檔案的第n個紀錄,則需要順次經過檔案的第1,…,一直到第n-1個紀錄,才訪問到第n個紀錄;而直接訪問則不需要經過前面的n-1個紀錄,通過指定紀錄號即可直接訪問第n個紀錄,因此直接訪問無論是讀還是寫,都可以按照任意的順序進行。

這兩種不同的訪問方法很大程度上是由儲存檔案的媒質以及系統的約定等外部因素決定的,例如儲存在磁帶上面的可能就只允許採用序列訪問的方式進行訪問。

不過當乙個檔案被聯結到了乙個特定的部件之後,或者是預聯結的檔案被生成之後,它的訪問方式就已經被決定了。

這兩種不同的訪問方式是由對檔案的聯結方式決定的,而不是屬於檔案自身的屬性。乙個檔案可以只能通過序列訪問方式來訪問,也可以只能通過直接訪問方式來訪問,也可以分別通過這兩種方式來訪問,但不能同時用這兩種方式來訪問,也就是說當檔案通過某個聯結而被程式按照序列方式來訪問,那麼需要使用close語句來關閉該聯結之後,再使用open語句重新建立新的聯結,才能換為按照直接訪問的方式來訪問。

第8章程式設計基礎

一 是非題。和loop作用相同,都能終止迴圈。a.對b.錯 2.自定義函式與過程檔案的不同在於自定義函式必須返回乙個值。a.對b.錯 語句只能接收字元型常量。a.對b.錯 4.不管是過程還是函式,接收引數的命令必須出現在被調程式的第一行。a.對b.錯 5.過程檔案可以由若干個過程構成,而過程必須放在...

第02章程式設計環境

2.1 cb介面 2.2 win 版 hello world 2.2.1 乙個空白工程 2.2.2 最簡單的hello world工程 2.3 dos 版 hello world 2.3.1 乙個空白的控制台工程 2.3.2 用控制台輸出 hello world 2.4 簡單程式除錯 2.4.1 編...

第16章措施專案

說明16.1 腳手架 一 總體說明 1 本章腳手架措施專案材料均按鋼管式腳手架編制。2 本章腳手架措施專案是指施工需要的腳手架搭 拆 運輸及腳手架攤銷的工料消耗。不包括屬於安全措施費中的水平安全網 臨邊 洞口防護。3 本章定額已包括搭設腳手架所需周轉性材料 垂直密閉網 上料平台 護衛欄杆 金屬架油漆...