Fortran95第16章-數(shù)據(jù)文件的管理_第1頁
Fortran95第16章-數(shù)據(jù)文件的管理_第2頁
Fortran95第16章-數(shù)據(jù)文件的管理_第3頁
Fortran95第16章-數(shù)據(jù)文件的管理_第4頁
Fortran95第16章-數(shù)據(jù)文件的管理_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第16章

數(shù)據(jù)文件的管理固然,我們編制一個科學計算程序的目的是執(zhí)行給定的計算,是描述一個通過算法而實現(xiàn)的對輸入數(shù)據(jù)的計算的過程,而不只是簡單的對數(shù)據(jù)的處理,但是這并不妨礙我們從信息處理的角度來看待這個過程。因為任何的計算,再簡單也必定包含數(shù)據(jù)的輸入與輸出過程,更復雜的計算程序則還包含數(shù)據(jù)的緩存管理,不同程序單位之間的數(shù)據(jù)傳遞,特別是在程序的計算涉及到龐大的數(shù)據(jù)量時,例如在工程計算中常見的大數(shù)組等,更加不能依靠單純的變量來管理龐大的數(shù)據(jù)量。實際上分析一下我們自己進行計算的情形,就知道在計算過程當中進行數(shù)據(jù)管理同樣是一件非常重要的事務,而按照計算機的從馮紐曼時代就已經(jīng)給予奠基的基本模型來看,一臺計算機的有效工作,依賴于指令流與數(shù)據(jù)流的有機合作,因此FORTRAN語言除了要描述計算,還要能夠描述對于數(shù)據(jù)流的管理。在前面我們已經(jīng)討論了FORTRAN程序的內(nèi)部通訊問題,那種通訊完全是依賴變量機制來進行的,因為那種通訊都是緊密關聯(lián)于計算的通訊,直接在變量之間進行數(shù)據(jù)值的交換能夠保證計算的效率和速度。但是一旦計算所涉及的數(shù)據(jù)量非常龐大,而計算過程對于數(shù)據(jù)的輸入與輸出要求更加復雜時,變量機制就不足以承擔數(shù)據(jù)處理的功能,因此FORTRAN提供了單獨的輸入輸出語句以及文件的概念,來實現(xiàn)對數(shù)據(jù)流的輸入輸出的管理。除了作為面向程序自身的數(shù)據(jù)輸入輸出管理的功能之外,一個FORTRAN程序的完整運行還必須包括程序與人的交互,而一旦涉及到機器與人的交互,自然要求任何數(shù)據(jù)都必須以適宜于人的辨識與處理的格式出現(xiàn)于一定的物理媒質上,這就是輸入與輸出的編輯問題,將是下章所要討論的內(nèi)容,本章則只說明FORTRAN所提供的輸入輸出處理語句。FORTRAN用于處理與管理輸入輸出數(shù)據(jù)的語句分為如下四大類:●

文件聯(lián)結語句。包括OPEN語句和CLOSE語句。●

數(shù)據(jù)傳輸語句。這一類語句又可以分為2個小類別:●

據(jù)傳輸輸入語句,包括READ語句?!?/p>

據(jù)傳輸輸出語句,包括WRITE語句和PRINT語句。●

文件定位語句。包括BACKSPACE語句,ENDFILE語句以及REWIND語句。●

文件查詢語句。包括INQUIRE語句。這些語句所要實現(xiàn)的首要的功能,就是控制數(shù)據(jù)的輸入與輸出,即數(shù)據(jù)從外部媒質到內(nèi)存,或從內(nèi)部文件到內(nèi)存的輸入,以及數(shù)據(jù)從內(nèi)存到外部媒質,或從內(nèi)存到內(nèi)部文件的輸出。然后就是輔助性的用來操縱外部媒質,以及描述或查詢文件與外部媒質的聯(lián)結屬性的功能。下面在給出FORTRAN管理數(shù)據(jù)輸入輸出的一般概念之后,再分別詳細討論這些語句。16.1

輸入輸出管理的數(shù)據(jù)單位FORTRAN對于輸入輸出數(shù)據(jù)進行管理的基本單位概念是紀錄以及紀錄組成的文件,因此下面我們分別討論紀錄與文件概念。16.1.1

紀錄FORTRAN的變量一次只能存儲一個數(shù)據(jù)值,顯然不足以用來進行有效的數(shù)據(jù)管理,因此FORTRAN建立了專門的用來有組織地存儲任意數(shù)量的數(shù)據(jù)的概念,即文件。文件由一個紀錄的序列組成,而紀錄是一種邏輯形式上的單位,可以是終端或打印輸出上顯示的一行,也可以是外部存儲器上的一個邏輯紀錄,盡管紀錄總是與各種物理形式的數(shù)據(jù)單位保持一定的對應,但實際上是與具體的物理表現(xiàn)形式無關的,因為紀錄本質上是一個語法上的概念。實際上在FORTRAN里面并不存在物理紀錄的概念。組成一個文件的紀錄從語法地位上分為如下兩種:●

數(shù)據(jù)紀錄;●

文件終止紀錄。所謂數(shù)據(jù)紀錄就是作為文件的數(shù)據(jù)內(nèi)容的紀錄,而文件終止紀錄則純粹是一個語法意義上的紀錄,它不包含任何數(shù)據(jù)內(nèi)容,只是用來標志一個文件的終止。因此文件終止紀錄只能用作文件的最后一個紀錄,并且沒有長度的屬性。由于計算機本質上的串行工作模式,紀錄同樣是一個串行序列的結構,該序列的單位就是數(shù)據(jù)值,即一個數(shù)據(jù)值的序列組成一個紀錄。對于數(shù)據(jù)紀錄來說,其中的數(shù)據(jù)值可以有如下兩種表示形式:●

無格式數(shù)據(jù);●

格式化數(shù)據(jù)。所謂數(shù)據(jù)的是否具有格式,完全是針對人而言的,即具有格式的數(shù)據(jù)就是把數(shù)據(jù)轉化為便于人的閱讀的字符型數(shù)據(jù)表示形式,也就是文字與數(shù)字,或者說ASCII編碼形式;而所謂無格式數(shù)據(jù)就是FORTRAN程序自身所實際處理的數(shù)據(jù)的在物理層面上的表示形式,一般都是二進制表示的數(shù)字形式。對于計算機來說,世界上的任何形式的信息,終歸都要表示為這種形式的數(shù)據(jù)。一個FORTRAN程序所涉及到的任何數(shù)據(jù),在該程序運行時,無論是作為運行的結果還是作為運行的初始值,它寫入到內(nèi)存當中,或從內(nèi)存當中讀出,或者是從內(nèi)存到硬盤的輸入輸出,數(shù)據(jù)流里面的數(shù)據(jù)都是無格式數(shù)據(jù)。而一旦數(shù)據(jù)需要人的閱讀,就必須把二進制數(shù)據(jù)形式轉換為能夠被人閱讀的字符形式,實際上我們編寫的源碼就是這種形式的數(shù)據(jù)。一個數(shù)據(jù)紀錄或者完全由無格式的數(shù)據(jù)組成,稱為無格式紀錄;或者完全由格式化數(shù)據(jù)組成,稱為格式化紀錄。無格式紀錄完全只是在機器內(nèi)部存在,它的具體的數(shù)據(jù)形式是由系統(tǒng)決定的,最常見的就是二進制形式。這種紀錄完全不需要人的監(jiān)視與閱讀,而格式化紀錄則完全是人用來給機器輸入數(shù)據(jù),或機器向人展示數(shù)據(jù)結果的數(shù)據(jù)紀錄形式,因此當人向機器輸入格式化紀錄后,機器必須再把它翻譯為無格式的紀錄,才能被程序所使用,反之亦然。格式化紀錄的好處就是便于人的閱讀,它只能通過格式化輸入輸出語句來讀或寫;而無格式的紀錄的特點就是能夠直接得到機器的處理,相應的它也只能通過無格式的輸入輸出語句來讀或寫。對于紀錄可以定義長度的概念。格式化紀錄的長度就是其所包含的字符的數(shù)目;而無格式紀錄的長度同樣用來計量其中數(shù)據(jù)量的大小,它的具體度量方法的定義則依賴于具體的處理器系統(tǒng)對于數(shù)據(jù)量單位的定義。格式化紀錄和無格式紀錄的長度都可以為0。除了包含數(shù)據(jù)值的紀錄之外,還有文件終止紀錄。由于它只是起文件終止的語法標志作用,因此它不包含任何數(shù)據(jù),所以它的長度也就是0。一個文件至多只能包含一個文件終止紀錄,并且只能是文件的最后一個紀錄。文件終止紀錄可以有如下幾種生成方式:●

可以通過文件的序列訪問,最后用一個ENDFILE語句顯式地寫下來;●

也可以通過文件定位語句,如REWIND語句或BACKSPACE語句,而隱式地寫下來;●

運用CLOSE語句關閉文件或部件,或者是正常地終止程序,或者是對同一個部件使用了另外一個OPEN語句,從而隱式地寫下來。從上面的文件終止紀錄的實現(xiàn)方式可以看出,這種紀錄并不需要任何實際的物理實現(xiàn)。16.1.2

文件一個紀錄的序列構成一個文件。在程序運行的任何時候,對于一個給定的文件,它的訪問方法,形式,操作以及紀錄的長度,都明確地存在相應的依賴于系統(tǒng)的合法性規(guī)定,同時文件也可以具有字符串類型的名稱,即所謂命名文件,不過對于該名稱所使用的字符形式或長度,都是由具體的系統(tǒng)來規(guī)定,以便與相應操作系統(tǒng)對于文件的命名約定保持一致。按照文件與程序的功能關系以及存儲性質,文件可以分為如下兩種:●

內(nèi)部文件;●

外部文件。所謂內(nèi)部文件存儲在程序可以訪問的內(nèi)存空間里面,而外部文件則存儲在系統(tǒng)的外部存儲部件上,例如硬盤。這種存儲位置的不同實際上也反映了它們對于程序的不同功能,因為這兩種存儲空間的物理性能差異決定了它們對于CPU是具有不同意義的。外部文件與內(nèi)部文件的這種不同功能意義體現(xiàn)在如下幾個不同的方面:●

文件的存在性。對于外部文件來說,程序需要訪問的一個外部文件可能是存在的,也可能是不存在的,都是合法的程序運行現(xiàn)象。例如INQUIRE語句,OPEN語句,CLOSE語句,WRITE語句,PRINT語句,REWIND語句,以及ENDFILE語句都可以引用一個并不存在的文件;而如果使用WRITE語句,PRINT語句,或ENDFILE語句來引用一個預聯(lián)結的并不存在的語句,就自然地能夠生成該文件。一個外部文件的不存在也可能是來源于系統(tǒng)對于硬盤空間的權限限制,例如對于一個FORTRAN應用程序來說,系統(tǒng)文件以及FORTRAN編譯器程序文件都不應該被訪問。而對于程序來說,它所涉及的內(nèi)部文件則都必須存在于相應的內(nèi)存空間里面。●

程序對外部文件的訪問需要通過與邏輯部件建立聯(lián)結,因此就需要相應的能夠對外部文件進行聯(lián)結,定位與查詢的語句,而對于內(nèi)部文件則不需要這些語句功能。同時這種聯(lián)結就使得外部文件具有定位的屬性?!?/p>

對于外部文件來說,它的訪問方式,合法形式,合法操作,以及合法紀錄長度等都不是由FORTRAN語言標準來規(guī)定,而是由操作系統(tǒng)對于文件的約定以及用戶的特定選擇來決定的;而內(nèi)部文件的內(nèi)容都是作為默認字符型變量的數(shù)據(jù)值的形式而儲存的,這些字符型數(shù)據(jù)值都是程序的通常的賦值過程所產(chǎn)生的,或者是輸出語句針對變量而給出的。如果內(nèi)部文件所表示的變量是一個標量,那么該文件就只有一個紀錄;如果該變量是一個數(shù)組,那么該數(shù)組的每一個元素組成該文件的一個紀錄,文件里面紀錄的順序就是數(shù)組的相應的元素順序,每個紀錄的長度就是相應元素的長度。16.1.3

文件的訪問由于文件的紀錄是一種串行的序列結構,要實現(xiàn)對文件的紀錄的訪問,可以有如下兩種方式:●

序列訪問;●

直接訪問。所謂序列訪問,就是順著文件的紀錄序列來訪問特定的紀錄,即如果要訪問文件的第n個紀錄,則需要順次經(jīng)過文件的第1,…,一直到第n-1個紀錄,才訪問到第n個紀錄;而直接訪問則不需要經(jīng)過前面的n-1個紀錄,通過指定紀錄號即可直接訪問第n個紀錄,因此直接訪問無論是讀還是寫,都可以按照任意的順序進行。這兩種不同的訪問方法很大程度上是由存儲文件的媒質以及系統(tǒng)的約定等外部因素決定的,例如存儲在磁帶上面的可能就只允許采用序列訪問的方式進行訪問。不過當一個文件被聯(lián)結到了一個特定的部件之后,或者是預聯(lián)結的文件被生成之后,它的訪問方式就已經(jīng)被決定了。這兩種不同的訪問方式是由對文件的聯(lián)結方式?jīng)Q定的,而不是屬于文件自身的屬性。一個文件可以只能通過序列訪問方式來訪問,也可以只能通過直接訪問方式來訪問,也可以分別通過這兩種方式來訪問,但不能同時用這兩種方式來訪問,也就是說當文件通過某個聯(lián)結而被程序按照序列方式來訪問,那么需要使用CLOSE語句來關閉該聯(lián)結之后,再使用OPEN語句重新建立新的聯(lián)結,才能換為按照直接訪問的方式來訪問。能夠直接訪問讀的紀錄只限于已經(jīng)寫下來的紀錄。能夠直接訪問寫的文件限于建立了直接訪問聯(lián)結的文件。1.序列訪問一個外部文件建立了序列訪問的聯(lián)結之后,它就具有如下的屬性:●

如果針對該文件的直接訪問是非法的,那么組成該文件的紀錄的順序就是寫入該文件的紀錄順序;如果同時針對該文件的直接訪問也是合法的,那么該文件的紀錄的順序由直接訪問來決定,即序列訪問該文件的第一個紀錄就是直接訪問該文件所指定的紀錄號為1的紀錄,后面順次類推。●

文件的紀錄或者全部是格式化紀錄,或者全部是無格式紀錄,當然有可能出現(xiàn)在文件最后的文件終止紀錄除外。只要該文件的前一個引用不是數(shù)據(jù)傳輸輸出語句或文件定位語句,那么文件的最后一個紀錄就一定是文件終止紀錄?!?/p>

文件的紀錄不允許直接訪問輸入輸出語句的讀與寫。2.直接訪問如果一個外部文件所建立的聯(lián)結是直接訪問,那么該文件具有如下屬性:●

文件的所有紀錄都具有一個唯一的紀錄號,該紀錄號為一個正整數(shù),是在寫紀錄時給定的,而這個紀錄號一旦給定,就再也不能改變。該紀錄號決定了文件的紀錄的順序。●

文件的任何紀錄不允許被刪除,但允許被改寫。●

文件的紀錄或者全部是格式化紀錄,或者全部是無格式紀錄。如果對于該文件序列訪問方式也是合法的,那么當該文件被聯(lián)結到直接訪問時,它有可能包含的文件終止紀錄則不被認為是屬于該文件的一部分。如果對于該文件不允許序列訪問,那么該文件就不能包含文件終止紀錄。●

只有通過直接訪問輸入輸出語句才能實現(xiàn)對紀錄的讀和寫。●

文件所有的紀錄的長度相同。●

對于一個文件的紀錄的讀寫順序不一定要求按照紀錄號的順序。一旦文件與部件建立了聯(lián)結,那么對于該文件的紀錄的讀寫可以是任意順序的。●

文件的紀錄不能使用表控格式,名稱列表格式,或通過非預輸入輸出語句來讀寫。16.1.4

文件的定位由于文件是一個數(shù)據(jù)的集合,因此程序在運行過程當中,對于文件的讀寫操作總是意味著程序當前所使用的數(shù)據(jù)是在發(fā)生變化的,為了描述程序當前所使用的數(shù)據(jù)或紀錄,F(xiàn)ORTRAN定義了文件的位置的概念,并且還給出了專門用來對文件位置進行操作的語句,以便實現(xiàn)對文件所包含的數(shù)據(jù)的精確訪問與操作。針對文件所包含的紀錄的串行序列結構,以及紀錄本身所包含的數(shù)據(jù)值的串行序列結構,F(xiàn)ORTRAN定義了如下幾個特征性的文件的定位情形:●

初始點。即文件第一個紀錄前面緊接該紀錄的位置。如果文件定位在這個位置,那么程序對于該文件的操作將從文件的第一個紀錄開始?!?/p>

終止點。即文件最后一個紀錄后面緊接該紀錄的位置。如果文件定位在這個位置,那么程序接下來的操作將不進入該文件。如果文件為空文件,即不包含任何數(shù)據(jù),那么它的初始點和終止點相同●

對于文件的定位可以處于兩個緊接的紀錄中間,這時位于該位置的前面的那個紀錄稱為前紀錄,而位于該位置的后面的那個紀錄稱為后紀錄。當然對于初始點不存在前紀錄,而對于終止點則不存在后紀錄。●

對于文件的定位也可以是在輸入輸出語句運行時的當前紀錄上面,這時該當前紀錄的緊接的前面的那個紀錄稱為其前紀錄,而該當前紀錄的緊接的后面的那個紀錄稱為其后紀錄。當然,如果文件定位不是在一個紀錄里面,那么當前紀錄就不存在。當文件定位處于當前文件時,還可以更加詳細地描述為定位于當前紀錄的數(shù)據(jù)值序列的初始點或終止點,或紀錄的任意兩個數(shù)據(jù)值之間。即該紀錄的緊接在數(shù)據(jù)值序列的第一個數(shù)據(jù)值前面的位置,或緊接在數(shù)據(jù)值序列的最后一個數(shù)據(jù)值后面的位置,或在數(shù)據(jù)值序列里面的任意兩個數(shù)據(jù)值之間的位置?!?/p>

內(nèi)部文件總是在數(shù)據(jù)傳輸之前定位在紀錄的開始位置?!?/p>

預輸入輸出操作總是以紀錄為單位的,因此完成這樣一個操作之后,文件總是定位于一個紀錄的終止位置或紀錄之間的位置;而非預輸入輸出操作是以字符為單位的,因此完成一個非預輸入輸出操作之后,文件有可能定位于當前紀錄的字符序列之間。輸入輸出語句的運行總能影響外部文件的定位,根據(jù)作用效果的不同,輸入輸出語句可以分為如下兩種:●

預輸入輸出語句。一個預輸入輸出語句總是在文件的最后一個紀錄完成讀寫之后對文件定位,除非中途發(fā)生錯誤?!?/p>

非預輸入輸出語句。一個非預輸入輸出語句可以定位于當前紀錄里面的字符位置,或者是隨后的紀錄上面。運用非預輸入輸出語句就可以通過一個輸入輸出語句序列讀寫文件的紀錄,其中每個語句訪問紀錄的一部分。這種語句也可以用來讀可變長度的紀錄。在數(shù)據(jù)傳輸之前的文件的定位在直接訪問文件與序列訪問文件時有不同的約定:●

序列輸入時,如果存在當前紀錄,那么文件定位不變;否則文件定位于下一個紀錄的頭部,自然該紀錄就成為了當前紀錄。如果這個紀錄不存在,或者在存在當前紀錄,而最近訪問文件的數(shù)據(jù)傳輸語句執(zhí)行的是輸出,那么該輸入就不執(zhí)行?!?/p>

如果文件包含文件終止紀錄,那么在數(shù)據(jù)傳輸之前文件不能定位于文件終止紀錄后面。可以運用REWIND語句和BACKSPACE語句來對文件重定位。●

序列輸出時,如果存在當前紀錄,那么文件定位不會變化,當前紀錄成為文件的最后紀錄;如果不存在當前紀錄,那么就生成下一個紀錄作為文件的當前紀錄,文件定位于該當前紀錄的頭部。●

如果是直接訪問,文件的定位情形非常簡單,即定位于紀錄說明符所指定的紀錄的頭部。該紀錄就是文件的當前紀錄。在數(shù)據(jù)傳輸過程結束之后,文件的定位有如下幾種情形:●

如果數(shù)據(jù)傳輸過程了發(fā)生錯誤,那么文件定位就是不可預知的?!?/p>

如果數(shù)據(jù)傳輸過程沒有發(fā)生錯誤,但是讀入了文件終止紀錄而導致文件終止,那么文件定位于文件終止紀錄之后?!?/p>

對于非預輸入如果沒有出現(xiàn)錯誤,也沒有出現(xiàn)文件終止條件,但是出現(xiàn)了紀錄終止條件,那么文件定位于剛讀入的紀錄之后;如果紀錄終止條件也沒有出現(xiàn),那么文件定位不變。●

對于非預輸出如果沒有出現(xiàn)錯誤,則文件定位不變?!?/p>

在所有的其他情況下,文件定位于剛讀寫過的紀錄之后,該紀錄就成為了前紀錄。16.1.5

內(nèi)部文件內(nèi)部文件的概念是FORTRAN語言的一個很大的特點,它實現(xiàn)了數(shù)據(jù)從內(nèi)存到內(nèi)存的傳輸與轉換的功能。內(nèi)部文件的屬性與約定如下:●

內(nèi)部文件為默認字符型變量,不能是帶向量下標的數(shù)組片斷。●

內(nèi)部文件的紀錄為標量字符變量。●

如果文件本身就是一個標量字符變量,那么該文件就只包含一個紀錄,其長度就是標量字符變量的長度。如果內(nèi)部文件是一個字符數(shù)組,那么它就被看成是一個字符數(shù)組元素的序列,其中的每個元素都是該文件的一個紀錄,該文件紀錄的順序就是該數(shù)組或數(shù)組片斷的數(shù)組元素序,該文件的每個紀錄的長度都相同,即數(shù)組元素的長度。●

寫入內(nèi)部文件紀錄的同時就定義了該紀錄。如果寫入字符數(shù)目少于紀錄長度,那么紀錄多余的空間就被填上空字符。寫入的字符數(shù)目不能超過紀錄長度?!?/p>

只有在內(nèi)部文件的紀錄被定義之后,才能讀入該紀錄。●

內(nèi)部文件的紀錄除了通過輸入語句之外,還可以使用其他方法得到定義或去定義,例如字符賦值語句也能夠定義作為紀錄的字符變量?!?/p>

在數(shù)據(jù)傳輸之前,內(nèi)部文件總是定位于第一個紀錄的頭部,而該紀錄就是當前紀錄?!?/p>

在輸入內(nèi)部文件時,對空格的處理與使用具有值NULL的說明符BLANK=來打開外部文件一樣,在必要的時候紀錄可以添加空格?!?/p>

在表控輸出時,字符常量不能定界。●

內(nèi)部文件紀錄的讀與寫只能通過不說明名稱列表格式的序列訪問格式化輸入輸出語句來完成。●

內(nèi)部文件不能出現(xiàn)在文件聯(lián)結語句,文件定位語句以及文件查詢語句當中。16.2

文件的部件聯(lián)結與訪問程序要和文件進行通訊,都需要程序通過一定的部件聯(lián)結到文件,即通過部件輸出數(shù)據(jù)到文件,通過部件從文件輸入數(shù)據(jù)到程序。這里的所謂部件是一個純粹的邏輯概念,而不是一個物理概念,之所以要引入這么一個邏輯概念,主要的原因就是為了在語言里獲得對輸入輸出的通用描述。因為我們知道文件概念實際上是與操作系統(tǒng)與硬件存儲形式密切相關的,不同的操作系統(tǒng)與硬件存儲形式里面,對于文件往往有不同的形式約定,因此為了使得對輸入輸出能夠有不依賴于具體系統(tǒng)的描述,F(xiàn)ORTRAN引入了部件這個邏輯概念作為數(shù)據(jù)從程序到文件之間的橋梁。部件使用如下的語法表示方法(R901):

io-unit其中的輸入輸出部件(io-unit)可以具有如下三種形式之一:

external-file-unit

*

internal-file-unit其中外部文件部件的表示形式為標量整型表達式或者是一個星號,而內(nèi)部文件部件的表示形式為默認字符型變量。部件的一般規(guī)則如下:●表示內(nèi)部文件部件的默認字符型變量不能是帶有向量下標的數(shù)組片斷。●一個部件可以作為外部部件也可以作為內(nèi)部部件。外部部件用來聯(lián)結外部文件;而內(nèi)部部件用來聯(lián)結內(nèi)部文件。●如果表示內(nèi)部文件部件的字符型變量是指針,那么該指針必須是獲得了關聯(lián)的?!袢绻硎緝?nèi)部文件部件的字符型變量是一個可分配數(shù)組,或者這樣一個數(shù)組的子對象,那么該數(shù)組必須是當前可分配的?!癖硎就獠课募考臉肆空捅磉_式必須是0或正整數(shù)?!癯霈F(xiàn)在文件聯(lián)結語句,文件定位語句,以及文件查詢語句當中的輸入輸出部件只能表示外部文件部件?!裨谝粋€程序的所有程序單位里面,一個表示外部文件部件的標量整型表達式的值,表示同一個外部部件?!裥翘柋硎绢A先聯(lián)結用來進行格式化序列訪問的特定的與系統(tǒng)相關的外部部件?!駥τ谝粋€給定程序,在任意的時間總是存在一個與系統(tǒng)相關的外部部件集合。所有的輸入輸出語句都可以使用存在的部件,而INQUIRE語句和CLOSE語句還可以使用不存在的部件?!纠?6-1】

SUBROUTINEAREAD(6)X...SUBROUTINEBN=6REWINDN在這個程序例子里面,兩個不同的程序單位里面出現(xiàn)的外部部件名稱6表示同一個外部部件。16.2.1

文件到部件的聯(lián)結與預聯(lián)結一個外部部件可以被聯(lián)結,也可以不被聯(lián)結,這兩種狀態(tài)都是合法的。外部部件通過預聯(lián)結或通過使用OPEN語句而獲得與一個外部文件的聯(lián)結,正是這種聯(lián)結使得外部文件能夠被程序訪問。這種訪問也就是輸入輸出語句的功能所在,或者準確地說是除了OPEN語句,CLOSE語句,以及INQUIRE語句之外的所有輸入輸出語句因此而能夠通過外部部件而訪問相應的外部文件或對相應的外部文件進行操作。文件到部件的聯(lián)結與預聯(lián)結的一般規(guī)則如下:●一個文件可以與部件建立聯(lián)結但本身卻還不存在,例如一個已經(jīng)建立了預聯(lián)結的文件,但可能還沒有被寫入。●一個部件在同一個時間不能聯(lián)結多于一個文件;而一個文件也不能在同一個時間與多于一個的部件相聯(lián)結?!駡?zhí)行CLOSE語句之后,相關的外部部件就失去了聯(lián)結,然后在同一個程序單位里面,該部件仍然可以根據(jù)程序的需要再次與同一個文件或不同的文件建立聯(lián)結。類似的,執(zhí)行CLOSE語句之后,相關的外部文件也失去了聯(lián)結,然后在同一個程序單位里面,該文件仍然可以根據(jù)程序的需要而再次與同一個部件或不同的設備建立聯(lián)結?!褚坏┮粋€文件失去了聯(lián)結,那么再次引用該文件的唯一方法就是在OPEN語句或INQUIRE語句里面引用該文件的名稱,而如果失去聯(lián)結的文件沒有名稱,那么就無法使得它再次獲得聯(lián)結。●對于內(nèi)部部件來說,總聯(lián)結到由標志該部件的默認字符型變量所給出的內(nèi)部文件?!褚坏┎考c文件建立了聯(lián)結,那么也就意味著建立了訪問的方法,或者是序列訪問,或者是直接訪問。●一旦與一個已經(jīng)存在的文件,或者是通過聯(lián)結而生成的新文件建立聯(lián)結,那么就會建立相應的格式化或非格式的數(shù)據(jù)格式。如果聯(lián)結是通過執(zhí)行OPEN語句而建立的,那么在沒有指定數(shù)據(jù)格式的情形下給出默認數(shù)據(jù)格式;如果聯(lián)結為預聯(lián)結到一個已經(jīng)存在的文件,那么數(shù)據(jù)格式由預聯(lián)結建立;如果預聯(lián)結到一個不存在的文件,那么數(shù)據(jù)格式可以建立,也可以推遲到文件生成之后再建立,例如運行格式化或非格式的WRITE語句之后。16.2.2

OPEN語句OPEN語句的功能就是建立初始的外部文件與指定部件之間的聯(lián)結,或者是修改該聯(lián)結。具體地說,一個OPEN語句可以產(chǎn)生如下幾種作用:●

聯(lián)結一個已經(jīng)存在的文件到部件;●

產(chǎn)生一個已經(jīng)預聯(lián)結的文件;●

產(chǎn)生一個新的文件然后把它聯(lián)結到指定部件;●

改變一個文件與部件之間聯(lián)結的特定說明符。OPEN語句的語法形式(R904)為:

OPEN(connect-spec-list)其中的聯(lián)結說明(connect-spec)的語法形式(R905)有以下幾種:[UNIT=]external-file-unitIOSTAT=scalar-default-int-variableERR=labelFILE=file-name-exprSTATUS=scalar-default-char-exprACCESS=scalar-default-char-exprFORM=scalar-default-char-exprRECL=scalar-int-exprBLANK=scalar-default-char-exprPOSITION=scalar-default-char-exprACTION=scalar-default-char-exprDELIM=scalar-default-char-exprPAD=scalar-default-char-expr其中的文件名稱表達式(file-name-expr)為標量默認字符型表達式(R906)。OPEN語句的一般規(guī)則為:●

如果在部件說明符里面省略可選字符UNIT=,那么聯(lián)結說明列表(connect-spec-list)的第一項必須是部件說明符?!?/p>

在一個給定OPEN語句里面,任何說明符都至多只能出現(xiàn)一次;其中必須給出外部文件部件(external-file-unit)?!?/p>

在說明符ERR=里面給出的語句標簽必須是與該OPEN語句同一個作用域單位里面的分支目標語句的標簽?!?/p>

如果說明符STATUS=的值為NEW或REPLACE,那么說明符FILE=必須同時給出。如果說明符STATUS=的值為SCRATCH,那么說明符FILE=不能同時出現(xiàn)。如果說明符STATUS=的值為OLD,那么說明符FILE=必須出現(xiàn),除非部件當前聯(lián)結到一個文件,并且該文件存在。●

說明符當中出現(xiàn)的標量默認字符表達式為字符的有限列表,尾部的空格被忽略。如果系統(tǒng)同時支持大小寫,那么字符取值不區(qū)分大小寫?!?/p>

在一個程序的任意程序單位里面,一旦一個外部部件通過OPEN語句獲得聯(lián)結,那么在該程序的任意程序單位里面都可以引用該部件?!?/p>

如果一個部件已經(jīng)聯(lián)結到一個存在的文件,仍然可以對該部件執(zhí)行OPEN語句。如果在該OPEN語句當中不包含F(xiàn)ILE=說明符,那么與該部件聯(lián)結的文件就是已經(jīng)與該部件聯(lián)結的文件。●

如果與部件聯(lián)結的文件并不存在,但是和已經(jīng)與部件預聯(lián)結的文件相同,那么由OPEN語句給出的屬性成為聯(lián)結的一部分。●

如果通過OPEN語句聯(lián)結到部件的文件與已經(jīng)與部件聯(lián)結的文件不同,那么這個OPEN語句的執(zhí)行效果相當于:在執(zhí)行OPEN語句之前,馬上執(zhí)行一個不帶有STATUS=說明符的CLOSE語句。●

如果通過OPEN語句聯(lián)結到部件的文件與已經(jīng)與部件聯(lián)結的文件相同,只是當前起作用的BLANK=,DELIM=,PAD=,ERR=,以及IOSTAT=這些說明符的值不同,那么會產(chǎn)生如下后果:●

如果OPEN語句當中包含POSITION=說明符,那么它的值可能與文件的當前定位不符?!?/p>

如果OPEN語句當中包含STATUS=說明符,那么它的值為OLD?!?/p>

BLANK=,DELIM=,PAD=這些說明符的值發(fā)生作用,而其他沒有出現(xiàn)的說明符不會發(fā)生變化,文件的定位也不會發(fā)生變化?!?/p>

此前執(zhí)行的任何OPEN語句的ERR=,以及IOSTAT=這些說明符對當前執(zhí)行的OPEN語句沒有影響。●

如果通過OPEN語句聯(lián)結到部件的文件與已經(jīng)與部件聯(lián)結的文件相同,那么具有值OLD的說明符STATUS=總是合法的,這時如果文件在執(zhí)行OPEN語句之前的狀態(tài)為SCRATCH,那么在部件關閉后,文件被刪除,并且認為具有SCRATCH狀態(tài)?!?/p>

如果一個文件已經(jīng)與一個部件建立聯(lián)結,那么對該文件運用OPEN語句使其與另外一個不同的部件建立聯(lián)結是非法的。【例16-2】OPEN(10,FILE='s',ACTION='READ',PAD='YES')下面更加詳細地說明OPEN語句當中所使用的各種說明符的含義。1FILE=●

說明符FILE=的值就是與給定部件聯(lián)結的文件的名稱。它尾部的所有空格都被忽略。而文件名稱表達式必須是系統(tǒng)的合法名稱?!?/p>

如果在OPEN語句當中省略該說明符,并且部件也沒有與文件建立聯(lián)結,那么說明符STATUS=給出值SCRATCH,這時部件聯(lián)結一個依賴具體系統(tǒng)的文件。2STATUS=●

其中的標量默認字符表達式取值為OLD,NEW,SCRATCH,REPLACE,以及UNKNOWN。●

當說明符取值為OLD時,文件存在,而取值為NEW時,則文件不存在?!?/p>

當具有值NEW的OPEN語句成功運行之后,生成相應的文件,然后狀態(tài)自然轉變?yōu)镺LD?!?/p>

當取值為REPLACE時,如果文件不存在,那么OPEN語句生成一個新文件,然后狀態(tài)取為OLD;而如果文件已經(jīng)存在,則該文件被刪除,OPEN語句生成一個新文件,具有與被刪除文件相同的文件名稱,然后狀態(tài)取為OLD?!?/p>

如果取值為SCRATCH,則生成文件并聯(lián)結到指定的部件,以供程序使用,然后在執(zhí)行引用同一個部件的CLOSE語句之后,或者是程序終止之后,該文件被刪除。●

SCRATCH不能用于命名文件。●

如果取值為UNKNOWN,則具體的狀態(tài)依賴于系統(tǒng)的約定。如果說明符被省略了,則默認值就是UNKNOWN。3ACCESS=●

其中標量默認字符表達式的取值為SEQUENTIAL或DIRECT。分別表示文件聯(lián)結的訪問方法為序列訪問或直接訪問?!?/p>

如果該說明符被省略,則默認取值為SEQUENTIAL。●

如果聯(lián)結文件已經(jīng)存在,那么該說明符指定的訪問方法必須對于該文件是合法的?!?/p>

如果文件不存在而需要生成新文件,那么說明符指定的訪問方法必須對于該新文件是合法的。4FORM=●

其中標量默認字符表達式取值為FORMATTED或UNFORMATTED。分別表示文件聯(lián)結為格式化輸入輸出或無格式輸入輸出。●

如果該說明符被省略了,那么在文件聯(lián)結為直接訪問時,默認值為UNFORMATTED;而如果文件聯(lián)結為序列訪問時,默認值為FORMATTED。●

如果聯(lián)結文件已經(jīng)存在,那么該說明符指定的格式必須對于該文件是合法格式?!?/p>

如果文件不存在而需要生成新文件,那么說明符指定的格式必須對于該新文件是合法格式。5RECL=●

該說明符的取值必須為正整數(shù)。在文件聯(lián)結為直接訪問的情況下,該取值表示文件的每個紀錄的長度;在文件聯(lián)結為序列訪問的情況下,該數(shù)值表示文件的所有紀錄當中最大的長度?!?/p>

在文件聯(lián)結為直接訪問時,該說明符必須給出。●

在文件聯(lián)結為序列訪問時,該說明符可以省略,默認值依賴于系統(tǒng)的約定。●

如果文件聯(lián)結為格式化輸入輸出,那么取值為只包含默認字符型字符的紀錄的字符數(shù)目。如果紀錄里面包含了非默認字符型,那么該說明符的取值依賴于系統(tǒng)的約定?!?/p>

如果文件聯(lián)結為無格式輸入輸出,那么紀錄長度由系統(tǒng)約定的度量單位來決定具體數(shù)值。●

如果聯(lián)結文件已經(jīng)存在,那么該說明符指定的長度必須對于該文件是合法長度?!?/p>

如果文件不存在而需要生成新文件,那么說明符指定的長度必須對于該新文件是合法長度。6BLANK=●

其中標量默認字符表達式的取值為NULL或ZERO?!?/p>

BLANK=說明符只能用于格式化輸入輸出的文件聯(lián)結?!?/p>

如果取值為NULL,那么在給定部件的數(shù)值格式化輸入域里面的所有空格字符都被忽略,除非全部為空格的域具有零值?!?/p>

如果取值為ZERO,那么除了頭部的空格之外,所有其他空格都被視為0?!?/p>

如果該說明符省略了,那么默認值為NULL。7.POSITION=●

其中標量默認字符表達式的取值為ASIS,REWIND,或APPEND。該說明符只能用于序列訪問的聯(lián)結?!?/p>

一個新生成的文件總是定位于初始點。●

REWIND使得一個已經(jīng)存在的文件定位于它的初始點。●

APPEND使得一個已經(jīng)存在的文件定位于文件終止紀錄的前紀錄,而如果該文件不包含文件終止紀錄,則定位于該文件的終止點。●

如果文件存在并且已經(jīng)聯(lián)結,那么ASIS使得它的定位不變,而如果文件存在但沒有聯(lián)結,那么ASIS表示它的定位未知。如果該說明符被省略,那么默認值為ASIS。8.ACTION=●

其中標量默認字符表達式可以取值為READ,WRITE,READWRITE。●

取值READ表示W(wǎng)RITE,PRINT,以及ENDFILE語句都不能引用該聯(lián)結。●

取值WRITE表示READ語句不能引用該聯(lián)結。●

取值READWRITE表示任何輸入輸出語句都可以引用該聯(lián)結?!?/p>

如果該說明符省略了,則默認值依賴于系統(tǒng)的約定?!?/p>

如果文件的合法操作里面包含了READWRITE,那么也應該包含READ和WRITE?!?/p>

如果聯(lián)結文件已經(jīng)存在,那么該說明符指定的操作必須對于該文件是合法操作。●

如果文件不存在而需要生成新文件,那么說明符指定的操作必須對于該新文件是合法操作。9.DELIM=●

該說明符只能用于具有格式化輸入輸出聯(lián)結的文件。在輸入格式化紀錄時該說明符被忽略?!?/p>

其中標量默認字符表達式可以取值為APOSTROPHE,QUOTE,NONE?!?/p>

如果取值為APOSTROPHE,則表控或名稱列表格式寫入的字符值的分隔必須使用撇號;而內(nèi)部撇號則必須使用雙撇號?!?/p>

如果取值為QUOTE,那么表控或名稱列表格式寫入的字符值的分隔必須使用引號;而內(nèi)部引號則必須使用雙引號?!?/p>

如果取值為NONE,那么寫入字符不能使用撇號或引號作為分隔標志,內(nèi)部撇號或引號也不能是雙的?!?/p>

如果該說明符被省略了,那么默認取值為NONE。10.PAD=●

該說明符只能用于具有格式化輸入輸出聯(lián)結的文件。在格式化紀錄輸出時,該說明符被忽略?!?/p>

其中的標量默認字符表達式可以取值為YES,NO。●

如果取值為YES,那么在給出了輸入列表,并且格式說明要求紀錄包含比它本來具有的數(shù)據(jù)更多的數(shù)據(jù)時,該格式化輸入紀錄可以在尾部添加足夠的空格?!?/p>

如果取值為NO,那么輸入列表以及格式說明都不能要求紀錄具有比它本來具有的數(shù)據(jù)更多的數(shù)據(jù)。●

如果該說明符被省略,那么默認取值為YES。●

對于非默認字符型數(shù)據(jù),對于附加的空格字符由系統(tǒng)約定。16.2.3

CLOSE語句CLOSE語句的功能為終止一個給定部件到一個外部文件的聯(lián)結。CLOSE語句的一般語法形式(R907)為:

CLOSE(close-spec-list)其中的關閉說明(close-spec)可以是如下幾種形式(R908)之一:[UNIT=]external-file-unitIOSTAT=scalar-default-int-variableERR=labelSTATUS=scalar-default-char-exprCLOSE語句的一般規(guī)則為:●

如果在部件說明當中省略了字符UNIT=,那么部件說明符必須是關閉說明列表的第一項.●

在一個給定關閉說明里面,任何說明符都只能出現(xiàn)一次,其中必須給出外部文件部件。●

出現(xiàn)在說明符ERR=當中的語句標簽,必須是在和CLOSE語句同一個作用域單位里面的分支目標語句的標簽。●

其中的標量默認字符表達式取值為字符型數(shù)據(jù),其尾部的空格都被忽略。如果系統(tǒng)同時支持大小寫,那么不區(qū)分字符的大小寫?!?/p>

在程序的任何程序單位里面都可以對某個部件執(zhí)行CLOSE語句,但是不能在同一個作用域單位里面和OPEN語句作用于同一個部件。●

針對一個不存在的部件,或者是一個沒有與文件聯(lián)結的部件執(zhí)行CLOSE語句是合法的,但是不影響任何文件。●

在一個作用域單位里面,如果一個部件被CLOSE語句關閉聯(lián)結之后,仍然可以再次和原來的文件,或者是另外的文件建立聯(lián)結?!?/p>

在一個作用域單位里面,如果一個命名文件被CLOSE語句關閉聯(lián)結,那么它仍然可以在該程序單位里面和同一個部件,或者另外的部件建立聯(lián)結,只要該文件一直存在?!?/p>

程序的執(zhí)行正常終止之后,所有的部件聯(lián)結都被關閉。如果在終止之前文件狀態(tài)為SCRATCH,那么關閉之后部件狀態(tài)為DELETE;其他情形下關閉之后的部件狀態(tài)為KEEP?!纠?6-3】

CLOSE(10,STATUS='KEEP')CLOSE語句的STATUS=說明符遵循如下規(guī)則:●

其中的標量默認字符表達式可以取值為KEEP,DELETE,分別表示是否保留與給定部件聯(lián)結的文件?!?/p>

KEEP不能用于在執(zhí)行CLOSE語句之前狀態(tài)為SCRATCH的文件?!?/p>

如果KEEP用于一個存在的文件,那么在執(zhí)行CLOSE語句之后,該文件繼續(xù)存在?!?/p>

如果KEEP用于一個不存在的文件,那么在執(zhí)行CLOSE語句之后,該文件仍然不存在。●

如果取值為DELETE,那么在執(zhí)行CLOSE語句之后,文件不再存在。●

如果該說明符被省略,那么默認值為KEEP,除非文件在執(zhí)行CLOSE語句之前狀態(tài)為SCRATCH,如果出現(xiàn)那種情況,則默認值為DELETE。16.3

文件的傳輸文件傳輸語句包括如下三種:●

READ語句,為數(shù)據(jù)輸入語句;●

WRITE語句和PRINT語句,為數(shù)據(jù)輸出語句。READ語句的一般語法形式(R909)為以下兩種形式之一:READ(io-control-spec-list)[input-item-list]READformat[,input-item-list]WRITE語句的一般語法形式(R910)為:WRITE(io-control-spec-list)[output-item-list]PRINT語句的一般語法形式(R911)為:PRINTformat[,output-item-list]對于其中的輸入輸出控制說明列表(io-control-spec-list)和數(shù)據(jù)輸入輸出項列表(input/output-item-list)在下面分節(jié)予以說明。【例16-4】READ(6,*)SIZEREAD10,A,BWRITE(6,10)A,S,JPRINT10,A,S,J10FORMAT(2E16.3,I5)16.3.1

控制信息列表所謂輸入輸出控制說明列表就是控制信息列表,用來控制數(shù)據(jù)的傳輸,包括如下的成分:●

數(shù)據(jù)傳輸?shù)脑椿蚰繕?;?/p>

可選的編輯過程的說明;●

可選的確定紀錄的說明;●

可選的對于需要排除的操作的說明;●

可選的狀態(tài)返回;●

可選的紀錄預說明;●

可選的讀入字符數(shù)目返回。輸入輸出控制說明的一般語法形式(R912)有如下幾種:[UNIT=]io-unit[FMT=]format[NML=]namelist-group-nameREC=scalar-int-expr

IOSTAT=scalar-default-int-variable

ERR=label

END=label

ADVANCE=scalar-default-char-expr

SIZE=scalar-default-int-variable

EOR=label按照控制信息列表所包含的內(nèi)容的不同,數(shù)據(jù)傳輸語句可以分為兩種:●

如果數(shù)據(jù)傳輸語句包含了格式說明或名稱列表集合名稱,那么該語句就屬于格式化輸入輸出語句。●

否則就屬于無格式輸入輸出語句。控制信息列表的一般規(guī)則為:●

在上面列舉的輸入輸出控制說明當中必須包含一個,也至多包含一個輸入輸出部件,而其他的說明選項至多出現(xiàn)一次。●

在WRITE語句當中不能出現(xiàn)END=,EOR=,以及SIZE=說明符。●

出現(xiàn)在說明符ERR=,EOR=,以及END=里面的語句標簽必須該數(shù)據(jù)傳輸語句所在的作用域單位里面的分支目標語句的標簽。●

如果在數(shù)據(jù)傳輸語句當中出現(xiàn)了輸入輸出項列表,那么就不能同時出現(xiàn)名稱列表集合名稱?!?/p>

一個輸入輸出控制說明列表里面不能同時包含一個格式說明和一個名稱列表集合名稱?!?/p>

如果部件說明符里面省略了字符UNIT=,那么控制信息列表的第一項必須是部件說明符?!?/p>

如果在格式說明符里面省略了字符FMT=,那么控制信息列表的第二項必須是格式說明符,而控制信息列表的第一項必須是不帶可選字符UNIT=的部件說明符。●

如果在名稱列表說明符里面省略了字符NML=,那么控制信息列表的第二項必須是名稱列表說明符,而控制信息列表的第一項必須是不帶可選字符UNIT=的部件說明符。●

如果部件說明符給出的是一個內(nèi)部文件,那么輸入輸出控制說明列表不能包含說明符REC=,也不能包含名稱列表集合名稱。●

如果語句當中給出了說明符REC=,那么其中就不能出現(xiàn)說明符END=和名稱列表集合名稱,如果出現(xiàn)格式說明,則不能是星號表示的表控輸入輸出?!?/p>

說明符ADVANCE=只能出現(xiàn)在具有顯式格式說明的格式化序列輸入輸出語句里面,其控制信息列表不包含內(nèi)部文件的部件說明符?!?/p>

如果出現(xiàn)了EOR=說明符,那么說明符ADVANCE=也必須同時出現(xiàn)。●

如果出現(xiàn)了SIZE=說明符,那么說明符ADVANCE=也必須同時出現(xiàn)?!?/p>

說明符SIZE=只能出現(xiàn)在包含取值為NO的說明符ADVANCE=的輸入語句當中?!?/p>

說明符EOR=只能出現(xiàn)在包含取值為NO的說明符ADVANCE=的輸入語句當中?!?/p>

如果數(shù)據(jù)傳輸語句的IOSTAT=或SIZE=說明符里面給出了變量,那么該變量不能關聯(lián)于數(shù)據(jù)傳輸輸入輸出列表里面的任何數(shù)據(jù)對象,也不能關聯(lián)于名稱列表集合對象列表里面的任何數(shù)據(jù)對象,也不能關聯(lián)于數(shù)據(jù)傳輸輸入輸出列表里面的隱式輸入輸出do結構里的do變量。●

在數(shù)據(jù)傳輸語句里面,如果由說明符IOSTAT=或者說明符SIZE=給出的變量為數(shù)組元素引用,那么數(shù)據(jù)傳輸,隱式輸入輸出do過程,或者在輸入輸出控制說明列表里面的其他說明符定義或賦值,都不影響其下標值?!纠?6-5】下面給出一個READ語句的例子。

READ(IOSTAT=IOS,UNIT=6,FMT='(10F8.2)')A,B下面我們分節(jié)說明控制信息列表的各種說明符以及相關內(nèi)容。1.格式說明符FMT=說明符FMT=的功能為在格式化輸入輸出語句當中提供格式說明,或提供表控格式。它的一般語法形式(R913)為default-char-exprlabel其中的標簽(label)必須是出現(xiàn)在同一個作用域單位里面的包含了格式說明符的作為FORMAT語句的標簽。其中的默認字符表達式(default-char-expr)表示一個有效的格式說明。該表達式也可以是一個特殊的字符常量,注意參考第7章里面對于表達式的說明。如果該表達式是一個數(shù)組的形式,那么可以把該數(shù)組看成是所有的數(shù)組元素按照數(shù)組元素序串聯(lián)起來。如果格式表示是其中的星號*,那么該語句就是所謂的表控輸入輸出語句。【例16-6】

READ(6,FMT="("http://CHAR_FMT//")")X,Y,Z在這個例子里面格式為字符表達式,其中CHAR_FMT為一個默認字符變量。2.名稱列表說明符NML=說明符NML=給出名稱列表集合名稱。該名稱表示了一個需要進行數(shù)據(jù)傳輸操作的數(shù)據(jù)對象的集合。如果語句當中給出了這個名稱列表集合名稱,那么該語句就是所謂名稱列表輸入輸出語句。3.紀錄數(shù)說明符REC=紀錄數(shù)說明符TheREC=給出需要讀寫的紀錄的數(shù)目。該說明符只能用于針對直接訪問聯(lián)結部件的輸入輸出語句,因此這個說明符可以說是一個標志性的東西,即只要控制信息列表里面包含了REC=說明符,那么該語句就是所謂直接訪問輸入輸出語句,否則就是所謂序列訪問輸入輸出語句。4.輸入輸出狀態(tài)說明符IOSTAT=執(zhí)行一個包含了IOSTAT=說明符的輸入輸出語句實際上也就是定義了在IOSTAT=說明符里面給出的變量。該變量的取值情況有如下幾種:●

如果語句執(zhí)行過程當中沒有出現(xiàn)錯誤條件,也沒有出現(xiàn)文件終止條件和紀錄終止條件,那么變量取值為0?!?/p>

如果出現(xiàn)錯誤條件,那么取值為系統(tǒng)約定的正整數(shù)值?!?/p>

如果出現(xiàn)文件終止條件,而沒有出現(xiàn)錯誤條件,那么取值為系統(tǒng)約定的負整數(shù)值?!?/p>

如果出現(xiàn)紀錄終止條件,而沒有出現(xiàn)錯誤條件與文件終止條件,那么取值為系統(tǒng)約定的不同于文件終止條件下的取值的負整數(shù)值。只有在執(zhí)行序列輸入語句時才會出現(xiàn)文件終止條件,而只有在執(zhí)行非預輸入語句時才會出現(xiàn)紀錄終止條件,參見下面的例子。【例16-7】

READ(FMT="(E8.3)",UNIT=3,IOSTAT=IOSS)XIF(IOSS<0)THEN!對聯(lián)結到部件3的文件進行文件終止操作.CALLEND_PROCESSINGELSEIF(IOSS>0)THEN!進行出錯處理CALLERROR_PROCESSINGENDIF5.出錯分支處理如果在執(zhí)行一個包含了說明符ERR=的輸入輸出語句時出現(xiàn)了錯誤條件,就會導致如下的分支后果:●

輸入輸出語句執(zhí)行中斷;●

輸入輸出語句給出的文件定位不可確定;●

如果該輸入輸出語句還包含了IOSTAT=說明符,那么其中給出的變量取值為系統(tǒng)約定的正整數(shù)值。●

如果執(zhí)行的語句是READ語句,并且包含了SIZE=說明符,那么變量取值整數(shù)值;●

繼續(xù)執(zhí)行由ERR=說明符給出的語句。6.文件終止時的分支處理如果在執(zhí)行包含了END=說明符的輸入語句時出現(xiàn)了文件終止條件,但沒有出現(xiàn)錯誤條件,那么會導致如下分支后果:●

輸入語句的執(zhí)行中斷;●

如果輸入語句中指定的文件是外部文件,那么它定位在文件終止紀錄的后面?!?/p>

如果輸入語句包含了說明符IOSTAT=,那么其中給出的變量取值為系統(tǒng)約定的負整數(shù)值?!?/p>

繼續(xù)執(zhí)行由END=說明符給出的語句。7.紀錄終止時的分支處理如果在執(zhí)行包含了EOR=說明符的輸入輸出語句時出現(xiàn)了紀錄終止條件,但沒有出現(xiàn)錯誤條件,那么會導致如下分支后果:●

如果語句當中包含的說明符PAD=的取值為YES,那么紀錄被添加上空格,以便滿足輸入列表項及其數(shù)據(jù)編輯描述符對于紀錄字符數(shù)目的要求。●

輸入語句的執(zhí)行中斷。●

輸入語句給出的文件定位于當前紀錄后面。●

如果輸入語句包含了說明符IOSTAT=,那么其中給出的變量取值為系統(tǒng)約定的負整數(shù)值?!?/p>

如果輸入語句包含了說明符SIZE=,那么其中給出的變量取值為整數(shù)值。●

繼續(xù)執(zhí)行由EOR=說明符給出的語句。8.ADVANCE=說明符其中的標量默認字符表達式(scalar-default-char-expr)可以取值為YES或NO。該說明符用來說明是否在輸入輸出語句當中出現(xiàn)非預輸入輸出。如果取值為NO,則出現(xiàn)非預輸入輸出;如果取值為YES,那么出現(xiàn)預格式化序列輸入輸出。如果該說明符省略了,那么默認取值為YES。9.字符數(shù)目說明符SIZE=當非預輸入語句中斷之后,在說明符SIZE=當中給出的變量,取值為在當前輸入語句執(zhí)行過程當中由數(shù)據(jù)編輯描述符傳輸?shù)淖址麛?shù)目。其中填充的空格不計入該字符數(shù)目值。16.3.2

數(shù)據(jù)傳輸?shù)妮斎胼敵隽斜硪粋€所謂輸入輸出列表給出通過數(shù)據(jù)傳輸輸入輸出語句傳輸了數(shù)據(jù)值的數(shù)據(jù)項。其中輸入項(input-item)的一般語法形式(R914)為:variableio-implied-do其中輸出項(output-item)的一般語法形式(R915)為:exprio-implied-do其中隱式輸入輸出do結構(io-implied-do)的一般語法形式(R916)為:(io-implied-do-object-list,io-implied-do-control)而里面的隱式do對象(io-implied-do-object)的語法形式(R917)為:input-itemoutput-item里面的隱式輸入輸出do控制(io-implied-do-control)的語法形式(R918)為:do-variable=scalar-int-expr,&&scalar-int-expr[,scalar-int-expr]輸入輸出列表的一般規(guī)則為:●

作為輸入項的變量不能是完全啞尺度數(shù)組。●

do變量必須是整型的命名標量變量。●

在輸入項列表(input-item-list)里面,隱式輸入輸出do對象(io-implied-do-object)●

必須是一個輸入項?!?/p>

在輸出項列表(output-item-list)里面,隱式輸入輸出do對象(io-implied-do-object)●

必須是一個輸出項。●

如果某個輸入項為指針,那么它必須當前關聯(lián)于一個可定義的目標數(shù)據(jù)對象,并且數(shù)據(jù)從文件傳輸?shù)疥P聯(lián)目標。如果某個輸出項為指針,那么它必須當前關聯(lián)于一個可定義的目標數(shù)據(jù)對象,并且數(shù)據(jù)從關聯(lián)目標傳輸?shù)轿募!?/p>

一個輸入項不能是一個包含輸入項的隱式輸入輸出do結構的do變量,也不能關聯(lián)于這樣的do變量?!?/p>

一個派生數(shù)據(jù)類型的對象,如果它的成員里面包含了指針,則不能作為輸入輸出列表里面的數(shù)據(jù)項。因為指針成員的值只是對于內(nèi)存地址的一個描述符,因此不具有獨立于系統(tǒng)的表示方法?!?/p>

如果輸入項或輸出項為可分配數(shù)組,那么它的當前狀態(tài)應該是已分配。●

包含在一個隱式輸入輸出do結構里面的隱式輸入輸出do結構的do變量,不能是其宿主結構的do變量,也不能關聯(lián)于這樣的do變量。●

如果是輸入輸出列表里面出現(xiàn)了數(shù)組作為列表項,那么其中的元素按照數(shù)組元素序的順序加以說明?!?/p>

數(shù)組的元素都不影響輸入項里面任何表達式的值,任何元素都不能在輸入項里面重復出現(xiàn)。●

輸入輸出列表當中的隱式do結構的循環(huán)初始化和執(zhí)行過程與DO結構的一樣。●

如果輸入輸出語句說明的是內(nèi)部文件,那么輸入輸出列表不能包含非默認字符類型的數(shù)據(jù)對象。●

常量,包含算符或函數(shù)引用的表達式,以及括號當中的表達式都可以出現(xiàn)在輸出列表里面,但不能出現(xiàn)在輸入列表里面?!纠?6-8】下面的例子里面既有合法的形式也有不合法的形式。INTEGERA(100),J(100)...READ*,A(A)!非法READ*,A(LBOUND(A,1):UBOUND(A,1))!合法READ*,A(J)!如果J的元素都不重復則是合法的READ*,A(A(1):A(10))!非法【例16-9】WRITE(LP,FMT='(10F8.2)')(LOG(A(I)),I=1,N+9,K),G這個例子的輸出列表里面包含了一個隱式do結構。16.3.3

數(shù)據(jù)傳輸輸入輸出語句的執(zhí)行執(zhí)行一個數(shù)據(jù)傳輸輸入輸出語句的完整過程如下:(1)決定數(shù)據(jù)傳輸?shù)姆较颍?2)確定相應的部件;(3)如果要求格式則建立相應的格式;(4)在文件傳輸之前對文件定位;(5)在文件與輸入輸出列表或名稱列表里面給出的數(shù)據(jù)項之間進行數(shù)據(jù)傳輸;(6)隨時判別是否出現(xiàn)錯誤條件,文件終止條件,以及紀錄終止條件;(7)在數(shù)據(jù)傳輸完成之后,再次對文件進行定位;(8)對說明符IOSTAT=和SIZE=里面的變量定義恰當?shù)闹怠?6.3.4

格式化紀錄的打印把格式化之后的紀錄傳輸給系統(tǒng)設置的外部設備就稱為打印。在打印一個格式化紀錄的時候,紀錄的第一個字符是格式說明,不被打印出來,而紀錄的其他字符都打印在一行上。紀錄的第一個字符必須是默認字符型數(shù)據(jù),它的功能在于決

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論