版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第16章
數(shù)據(jù)文件的管理固然,我們編制一個(gè)科學(xué)計(jì)算程序的目的是執(zhí)行給定的計(jì)算,是描述一個(gè)通過(guò)算法而實(shí)現(xiàn)的對(duì)輸入數(shù)據(jù)的計(jì)算的過(guò)程,而不只是簡(jiǎn)單的對(duì)數(shù)據(jù)的處理,但是這并不妨礙我們從信息處理的角度來(lái)看待這個(gè)過(guò)程。因?yàn)槿魏蔚挠?jì)算,再簡(jiǎn)單也必定包含數(shù)據(jù)的輸入與輸出過(guò)程,更復(fù)雜的計(jì)算程序則還包含數(shù)據(jù)的緩存管理,不同程序單位之間的數(shù)據(jù)傳遞,特別是在程序的計(jì)算涉及到龐大的數(shù)據(jù)量時(shí),例如在工程計(jì)算中常見(jiàn)的大數(shù)組等,更加不能依靠單純的變量來(lái)管理龐大的數(shù)據(jù)量。實(shí)際上分析一下我們自己進(jìn)行計(jì)算的情形,就知道在計(jì)算過(guò)程當(dāng)中進(jìn)行數(shù)據(jù)管理同樣是一件非常重要的事務(wù),而按照計(jì)算機(jī)的從馮紐曼時(shí)代就已經(jīng)給予奠基的基本模型來(lái)看,一臺(tái)計(jì)算機(jī)的有效工作,依賴于指令流與數(shù)據(jù)流的有機(jī)合作,因此FORTRAN語(yǔ)言除了要描述計(jì)算,還要能夠描述對(duì)于數(shù)據(jù)流的管理。在前面我們已經(jīng)討論了FORTRAN程序的內(nèi)部通訊問(wèn)題,那種通訊完全是依賴變量機(jī)制來(lái)進(jìn)行的,因?yàn)槟欠N通訊都是緊密關(guān)聯(lián)于計(jì)算的通訊,直接在變量之間進(jìn)行數(shù)據(jù)值的交換能夠保證計(jì)算的效率和速度。但是一旦計(jì)算所涉及的數(shù)據(jù)量非常龐大,而計(jì)算過(guò)程對(duì)于數(shù)據(jù)的輸入與輸出要求更加復(fù)雜時(shí),變量機(jī)制就不足以承擔(dān)數(shù)據(jù)處理的功能,因此FORTRAN提供了單獨(dú)的輸入輸出語(yǔ)句以及文件的概念,來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)流的輸入輸出的管理。除了作為面向程序自身的數(shù)據(jù)輸入輸出管理的功能之外,一個(gè)FORTRAN程序的完整運(yùn)行還必須包括程序與人的交互,而一旦涉及到機(jī)器與人的交互,自然要求任何數(shù)據(jù)都必須以適宜于人的辨識(shí)與處理的格式出現(xiàn)于一定的物理媒質(zhì)上,這就是輸入與輸出的編輯問(wèn)題,將是下章所要討論的內(nèi)容,本章則只說(shuō)明FORTRAN所提供的輸入輸出處理語(yǔ)句。FORTRAN用于處理與管理輸入輸出數(shù)據(jù)的語(yǔ)句分為如下四大類:●
文件聯(lián)結(jié)語(yǔ)句。包括OPEN語(yǔ)句和CLOSE語(yǔ)句。●
數(shù)據(jù)傳輸語(yǔ)句。這一類語(yǔ)句又可以分為2個(gè)小類別:●
據(jù)傳輸輸入語(yǔ)句,包括READ語(yǔ)句。●
據(jù)傳輸輸出語(yǔ)句,包括WRITE語(yǔ)句和PRINT語(yǔ)句。●
文件定位語(yǔ)句。包括BACKSPACE語(yǔ)句,ENDFILE語(yǔ)句以及REWIND語(yǔ)句?!?/p>
文件查詢語(yǔ)句。包括INQUIRE語(yǔ)句。這些語(yǔ)句所要實(shí)現(xiàn)的首要的功能,就是控制數(shù)據(jù)的輸入與輸出,即數(shù)據(jù)從外部媒質(zhì)到內(nèi)存,或從內(nèi)部文件到內(nèi)存的輸入,以及數(shù)據(jù)從內(nèi)存到外部媒質(zhì),或從內(nèi)存到內(nèi)部文件的輸出。然后就是輔助性的用來(lái)操縱外部媒質(zhì),以及描述或查詢文件與外部媒質(zhì)的聯(lián)結(jié)屬性的功能。下面在給出FORTRAN管理數(shù)據(jù)輸入輸出的一般概念之后,再分別詳細(xì)討論這些語(yǔ)句。16.1
輸入輸出管理的數(shù)據(jù)單位FORTRAN對(duì)于輸入輸出數(shù)據(jù)進(jìn)行管理的基本單位概念是紀(jì)錄以及紀(jì)錄組成的文件,因此下面我們分別討論紀(jì)錄與文件概念。16.1.1
紀(jì)錄FORTRAN的變量一次只能存儲(chǔ)一個(gè)數(shù)據(jù)值,顯然不足以用來(lái)進(jìn)行有效的數(shù)據(jù)管理,因此FORTRAN建立了專門(mén)的用來(lái)有組織地存儲(chǔ)任意數(shù)量的數(shù)據(jù)的概念,即文件。文件由一個(gè)紀(jì)錄的序列組成,而紀(jì)錄是一種邏輯形式上的單位,可以是終端或打印輸出上顯示的一行,也可以是外部存儲(chǔ)器上的一個(gè)邏輯紀(jì)錄,盡管紀(jì)錄總是與各種物理形式的數(shù)據(jù)單位保持一定的對(duì)應(yīng),但實(shí)際上是與具體的物理表現(xiàn)形式無(wú)關(guān)的,因?yàn)榧o(jì)錄本質(zhì)上是一個(gè)語(yǔ)法上的概念。實(shí)際上在FORTRAN里面并不存在物理紀(jì)錄的概念。組成一個(gè)文件的紀(jì)錄從語(yǔ)法地位上分為如下兩種:●
數(shù)據(jù)紀(jì)錄;●
文件終止紀(jì)錄。所謂數(shù)據(jù)紀(jì)錄就是作為文件的數(shù)據(jù)內(nèi)容的紀(jì)錄,而文件終止紀(jì)錄則純粹是一個(gè)語(yǔ)法意義上的紀(jì)錄,它不包含任何數(shù)據(jù)內(nèi)容,只是用來(lái)標(biāo)志一個(gè)文件的終止。因此文件終止紀(jì)錄只能用作文件的最后一個(gè)紀(jì)錄,并且沒(méi)有長(zhǎng)度的屬性。由于計(jì)算機(jī)本質(zhì)上的串行工作模式,紀(jì)錄同樣是一個(gè)串行序列的結(jié)構(gòu),該序列的單位就是數(shù)據(jù)值,即一個(gè)數(shù)據(jù)值的序列組成一個(gè)紀(jì)錄。對(duì)于數(shù)據(jù)紀(jì)錄來(lái)說(shuō),其中的數(shù)據(jù)值可以有如下兩種表示形式:●
無(wú)格式數(shù)據(jù);●
格式化數(shù)據(jù)。所謂數(shù)據(jù)的是否具有格式,完全是針對(duì)人而言的,即具有格式的數(shù)據(jù)就是把數(shù)據(jù)轉(zhuǎn)化為便于人的閱讀的字符型數(shù)據(jù)表示形式,也就是文字與數(shù)字,或者說(shuō)ASCII編碼形式;而所謂無(wú)格式數(shù)據(jù)就是FORTRAN程序自身所實(shí)際處理的數(shù)據(jù)的在物理層面上的表示形式,一般都是二進(jìn)制表示的數(shù)字形式。對(duì)于計(jì)算機(jī)來(lái)說(shuō),世界上的任何形式的信息,終歸都要表示為這種形式的數(shù)據(jù)。一個(gè)FORTRAN程序所涉及到的任何數(shù)據(jù),在該程序運(yùn)行時(shí),無(wú)論是作為運(yùn)行的結(jié)果還是作為運(yùn)行的初始值,它寫(xiě)入到內(nèi)存當(dāng)中,或從內(nèi)存當(dāng)中讀出,或者是從內(nèi)存到硬盤(pán)的輸入輸出,數(shù)據(jù)流里面的數(shù)據(jù)都是無(wú)格式數(shù)據(jù)。而一旦數(shù)據(jù)需要人的閱讀,就必須把二進(jìn)制數(shù)據(jù)形式轉(zhuǎn)換為能夠被人閱讀的字符形式,實(shí)際上我們編寫(xiě)的源碼就是這種形式的數(shù)據(jù)。一個(gè)數(shù)據(jù)紀(jì)錄或者完全由無(wú)格式的數(shù)據(jù)組成,稱為無(wú)格式紀(jì)錄;或者完全由格式化數(shù)據(jù)組成,稱為格式化紀(jì)錄。無(wú)格式紀(jì)錄完全只是在機(jī)器內(nèi)部存在,它的具體的數(shù)據(jù)形式是由系統(tǒng)決定的,最常見(jiàn)的就是二進(jìn)制形式。這種紀(jì)錄完全不需要人的監(jiān)視與閱讀,而格式化紀(jì)錄則完全是人用來(lái)給機(jī)器輸入數(shù)據(jù),或機(jī)器向人展示數(shù)據(jù)結(jié)果的數(shù)據(jù)紀(jì)錄形式,因此當(dāng)人向機(jī)器輸入格式化紀(jì)錄后,機(jī)器必須再把它翻譯為無(wú)格式的紀(jì)錄,才能被程序所使用,反之亦然。格式化紀(jì)錄的好處就是便于人的閱讀,它只能通過(guò)格式化輸入輸出語(yǔ)句來(lái)讀或?qū)?;而無(wú)格式的紀(jì)錄的特點(diǎn)就是能夠直接得到機(jī)器的處理,相應(yīng)的它也只能通過(guò)無(wú)格式的輸入輸出語(yǔ)句來(lái)讀或?qū)憽?duì)于紀(jì)錄可以定義長(zhǎng)度的概念。格式化紀(jì)錄的長(zhǎng)度就是其所包含的字符的數(shù)目;而無(wú)格式紀(jì)錄的長(zhǎng)度同樣用來(lái)計(jì)量其中數(shù)據(jù)量的大小,它的具體度量方法的定義則依賴于具體的處理器系統(tǒng)對(duì)于數(shù)據(jù)量單位的定義。格式化紀(jì)錄和無(wú)格式紀(jì)錄的長(zhǎng)度都可以為0。除了包含數(shù)據(jù)值的紀(jì)錄之外,還有文件終止紀(jì)錄。由于它只是起文件終止的語(yǔ)法標(biāo)志作用,因此它不包含任何數(shù)據(jù),所以它的長(zhǎng)度也就是0。一個(gè)文件至多只能包含一個(gè)文件終止紀(jì)錄,并且只能是文件的最后一個(gè)紀(jì)錄。文件終止紀(jì)錄可以有如下幾種生成方式:●
可以通過(guò)文件的序列訪問(wèn),最后用一個(gè)ENDFILE語(yǔ)句顯式地寫(xiě)下來(lái);●
也可以通過(guò)文件定位語(yǔ)句,如REWIND語(yǔ)句或BACKSPACE語(yǔ)句,而隱式地寫(xiě)下來(lái);●
運(yùn)用CLOSE語(yǔ)句關(guān)閉文件或部件,或者是正常地終止程序,或者是對(duì)同一個(gè)部件使用了另外一個(gè)OPEN語(yǔ)句,從而隱式地寫(xiě)下來(lái)。從上面的文件終止紀(jì)錄的實(shí)現(xiàn)方式可以看出,這種紀(jì)錄并不需要任何實(shí)際的物理實(shí)現(xiàn)。16.1.2
文件一個(gè)紀(jì)錄的序列構(gòu)成一個(gè)文件。在程序運(yùn)行的任何時(shí)候,對(duì)于一個(gè)給定的文件,它的訪問(wèn)方法,形式,操作以及紀(jì)錄的長(zhǎng)度,都明確地存在相應(yīng)的依賴于系統(tǒng)的合法性規(guī)定,同時(shí)文件也可以具有字符串類型的名稱,即所謂命名文件,不過(guò)對(duì)于該名稱所使用的字符形式或長(zhǎng)度,都是由具體的系統(tǒng)來(lái)規(guī)定,以便與相應(yīng)操作系統(tǒng)對(duì)于文件的命名約定保持一致。按照文件與程序的功能關(guān)系以及存儲(chǔ)性質(zhì),文件可以分為如下兩種:●
內(nèi)部文件;●
外部文件。所謂內(nèi)部文件存儲(chǔ)在程序可以訪問(wèn)的內(nèi)存空間里面,而外部文件則存儲(chǔ)在系統(tǒng)的外部存儲(chǔ)部件上,例如硬盤(pán)。這種存儲(chǔ)位置的不同實(shí)際上也反映了它們對(duì)于程序的不同功能,因?yàn)檫@兩種存儲(chǔ)空間的物理性能差異決定了它們對(duì)于CPU是具有不同意義的。外部文件與內(nèi)部文件的這種不同功能意義體現(xiàn)在如下幾個(gè)不同的方面:●
文件的存在性。對(duì)于外部文件來(lái)說(shuō),程序需要訪問(wèn)的一個(gè)外部文件可能是存在的,也可能是不存在的,都是合法的程序運(yùn)行現(xiàn)象。例如INQUIRE語(yǔ)句,OPEN語(yǔ)句,CLOSE語(yǔ)句,WRITE語(yǔ)句,PRINT語(yǔ)句,REWIND語(yǔ)句,以及ENDFILE語(yǔ)句都可以引用一個(gè)并不存在的文件;而如果使用WRITE語(yǔ)句,PRINT語(yǔ)句,或ENDFILE語(yǔ)句來(lái)引用一個(gè)預(yù)聯(lián)結(jié)的并不存在的語(yǔ)句,就自然地能夠生成該文件。一個(gè)外部文件的不存在也可能是來(lái)源于系統(tǒng)對(duì)于硬盤(pán)空間的權(quán)限限制,例如對(duì)于一個(gè)FORTRAN應(yīng)用程序來(lái)說(shuō),系統(tǒng)文件以及FORTRAN編譯器程序文件都不應(yīng)該被訪問(wèn)。而對(duì)于程序來(lái)說(shuō),它所涉及的內(nèi)部文件則都必須存在于相應(yīng)的內(nèi)存空間里面?!?/p>
程序?qū)ν獠课募脑L問(wèn)需要通過(guò)與邏輯部件建立聯(lián)結(jié),因此就需要相應(yīng)的能夠?qū)ν獠课募M(jìn)行聯(lián)結(jié),定位與查詢的語(yǔ)句,而對(duì)于內(nèi)部文件則不需要這些語(yǔ)句功能。同時(shí)這種聯(lián)結(jié)就使得外部文件具有定位的屬性?!?/p>
對(duì)于外部文件來(lái)說(shuō),它的訪問(wèn)方式,合法形式,合法操作,以及合法紀(jì)錄長(zhǎng)度等都不是由FORTRAN語(yǔ)言標(biāo)準(zhǔn)來(lái)規(guī)定,而是由操作系統(tǒng)對(duì)于文件的約定以及用戶的特定選擇來(lái)決定的;而內(nèi)部文件的內(nèi)容都是作為默認(rèn)字符型變量的數(shù)據(jù)值的形式而儲(chǔ)存的,這些字符型數(shù)據(jù)值都是程序的通常的賦值過(guò)程所產(chǎn)生的,或者是輸出語(yǔ)句針對(duì)變量而給出的。如果內(nèi)部文件所表示的變量是一個(gè)標(biāo)量,那么該文件就只有一個(gè)紀(jì)錄;如果該變量是一個(gè)數(shù)組,那么該數(shù)組的每一個(gè)元素組成該文件的一個(gè)紀(jì)錄,文件里面紀(jì)錄的順序就是數(shù)組的相應(yīng)的元素順序,每個(gè)紀(jì)錄的長(zhǎng)度就是相應(yīng)元素的長(zhǎng)度。16.1.3
文件的訪問(wèn)由于文件的紀(jì)錄是一種串行的序列結(jié)構(gòu),要實(shí)現(xiàn)對(duì)文件的紀(jì)錄的訪問(wèn),可以有如下兩種方式:●
序列訪問(wèn);●
直接訪問(wèn)。所謂序列訪問(wèn),就是順著文件的紀(jì)錄序列來(lái)訪問(wèn)特定的紀(jì)錄,即如果要訪問(wèn)文件的第n個(gè)紀(jì)錄,則需要順次經(jīng)過(guò)文件的第1,…,一直到第n-1個(gè)紀(jì)錄,才訪問(wèn)到第n個(gè)紀(jì)錄;而直接訪問(wèn)則不需要經(jīng)過(guò)前面的n-1個(gè)紀(jì)錄,通過(guò)指定紀(jì)錄號(hào)即可直接訪問(wèn)第n個(gè)紀(jì)錄,因此直接訪問(wèn)無(wú)論是讀還是寫(xiě),都可以按照任意的順序進(jìn)行。這兩種不同的訪問(wèn)方法很大程度上是由存儲(chǔ)文件的媒質(zhì)以及系統(tǒng)的約定等外部因素決定的,例如存儲(chǔ)在磁帶上面的可能就只允許采用序列訪問(wèn)的方式進(jìn)行訪問(wèn)。不過(guò)當(dāng)一個(gè)文件被聯(lián)結(jié)到了一個(gè)特定的部件之后,或者是預(yù)聯(lián)結(jié)的文件被生成之后,它的訪問(wèn)方式就已經(jīng)被決定了。這兩種不同的訪問(wèn)方式是由對(duì)文件的聯(lián)結(jié)方式?jīng)Q定的,而不是屬于文件自身的屬性。一個(gè)文件可以只能通過(guò)序列訪問(wèn)方式來(lái)訪問(wèn),也可以只能通過(guò)直接訪問(wèn)方式來(lái)訪問(wèn),也可以分別通過(guò)這兩種方式來(lái)訪問(wèn),但不能同時(shí)用這兩種方式來(lái)訪問(wèn),也就是說(shuō)當(dāng)文件通過(guò)某個(gè)聯(lián)結(jié)而被程序按照序列方式來(lái)訪問(wèn),那么需要使用CLOSE語(yǔ)句來(lái)關(guān)閉該聯(lián)結(jié)之后,再使用OPEN語(yǔ)句重新建立新的聯(lián)結(jié),才能換為按照直接訪問(wèn)的方式來(lái)訪問(wèn)。能夠直接訪問(wèn)讀的紀(jì)錄只限于已經(jīng)寫(xiě)下來(lái)的紀(jì)錄。能夠直接訪問(wèn)寫(xiě)的文件限于建立了直接訪問(wèn)聯(lián)結(jié)的文件。1.序列訪問(wèn)一個(gè)外部文件建立了序列訪問(wèn)的聯(lián)結(jié)之后,它就具有如下的屬性:●
如果針對(duì)該文件的直接訪問(wèn)是非法的,那么組成該文件的紀(jì)錄的順序就是寫(xiě)入該文件的紀(jì)錄順序;如果同時(shí)針對(duì)該文件的直接訪問(wèn)也是合法的,那么該文件的紀(jì)錄的順序由直接訪問(wèn)來(lái)決定,即序列訪問(wèn)該文件的第一個(gè)紀(jì)錄就是直接訪問(wèn)該文件所指定的紀(jì)錄號(hào)為1的紀(jì)錄,后面順次類推?!?/p>
文件的紀(jì)錄或者全部是格式化紀(jì)錄,或者全部是無(wú)格式紀(jì)錄,當(dāng)然有可能出現(xiàn)在文件最后的文件終止紀(jì)錄除外。只要該文件的前一個(gè)引用不是數(shù)據(jù)傳輸輸出語(yǔ)句或文件定位語(yǔ)句,那么文件的最后一個(gè)紀(jì)錄就一定是文件終止紀(jì)錄?!?/p>
文件的紀(jì)錄不允許直接訪問(wèn)輸入輸出語(yǔ)句的讀與寫(xiě)。2.直接訪問(wèn)如果一個(gè)外部文件所建立的聯(lián)結(jié)是直接訪問(wèn),那么該文件具有如下屬性:●
文件的所有紀(jì)錄都具有一個(gè)唯一的紀(jì)錄號(hào),該紀(jì)錄號(hào)為一個(gè)正整數(shù),是在寫(xiě)紀(jì)錄時(shí)給定的,而這個(gè)紀(jì)錄號(hào)一旦給定,就再也不能改變。該紀(jì)錄號(hào)決定了文件的紀(jì)錄的順序?!?/p>
文件的任何紀(jì)錄不允許被刪除,但允許被改寫(xiě)?!?/p>
文件的紀(jì)錄或者全部是格式化紀(jì)錄,或者全部是無(wú)格式紀(jì)錄。如果對(duì)于該文件序列訪問(wèn)方式也是合法的,那么當(dāng)該文件被聯(lián)結(jié)到直接訪問(wèn)時(shí),它有可能包含的文件終止紀(jì)錄則不被認(rèn)為是屬于該文件的一部分。如果對(duì)于該文件不允許序列訪問(wèn),那么該文件就不能包含文件終止紀(jì)錄?!?/p>
只有通過(guò)直接訪問(wèn)輸入輸出語(yǔ)句才能實(shí)現(xiàn)對(duì)紀(jì)錄的讀和寫(xiě)?!?/p>
文件所有的紀(jì)錄的長(zhǎng)度相同。●
對(duì)于一個(gè)文件的紀(jì)錄的讀寫(xiě)順序不一定要求按照紀(jì)錄號(hào)的順序。一旦文件與部件建立了聯(lián)結(jié),那么對(duì)于該文件的紀(jì)錄的讀寫(xiě)可以是任意順序的?!?/p>
文件的紀(jì)錄不能使用表控格式,名稱列表格式,或通過(guò)非預(yù)輸入輸出語(yǔ)句來(lái)讀寫(xiě)。16.1.4
文件的定位由于文件是一個(gè)數(shù)據(jù)的集合,因此程序在運(yùn)行過(guò)程當(dāng)中,對(duì)于文件的讀寫(xiě)操作總是意味著程序當(dāng)前所使用的數(shù)據(jù)是在發(fā)生變化的,為了描述程序當(dāng)前所使用的數(shù)據(jù)或紀(jì)錄,F(xiàn)ORTRAN定義了文件的位置的概念,并且還給出了專門(mén)用來(lái)對(duì)文件位置進(jìn)行操作的語(yǔ)句,以便實(shí)現(xiàn)對(duì)文件所包含的數(shù)據(jù)的精確訪問(wèn)與操作。針對(duì)文件所包含的紀(jì)錄的串行序列結(jié)構(gòu),以及紀(jì)錄本身所包含的數(shù)據(jù)值的串行序列結(jié)構(gòu),F(xiàn)ORTRAN定義了如下幾個(gè)特征性的文件的定位情形:●
初始點(diǎn)。即文件第一個(gè)紀(jì)錄前面緊接該紀(jì)錄的位置。如果文件定位在這個(gè)位置,那么程序?qū)τ谠撐募牟僮鲗奈募牡谝粋€(gè)紀(jì)錄開(kāi)始。●
終止點(diǎn)。即文件最后一個(gè)紀(jì)錄后面緊接該紀(jì)錄的位置。如果文件定位在這個(gè)位置,那么程序接下來(lái)的操作將不進(jìn)入該文件。如果文件為空文件,即不包含任何數(shù)據(jù),那么它的初始點(diǎn)和終止點(diǎn)相同●
對(duì)于文件的定位可以處于兩個(gè)緊接的紀(jì)錄中間,這時(shí)位于該位置的前面的那個(gè)紀(jì)錄稱為前紀(jì)錄,而位于該位置的后面的那個(gè)紀(jì)錄稱為后紀(jì)錄。當(dāng)然對(duì)于初始點(diǎn)不存在前紀(jì)錄,而對(duì)于終止點(diǎn)則不存在后紀(jì)錄。●
對(duì)于文件的定位也可以是在輸入輸出語(yǔ)句運(yùn)行時(shí)的當(dāng)前紀(jì)錄上面,這時(shí)該當(dāng)前紀(jì)錄的緊接的前面的那個(gè)紀(jì)錄稱為其前紀(jì)錄,而該當(dāng)前紀(jì)錄的緊接的后面的那個(gè)紀(jì)錄稱為其后紀(jì)錄。當(dāng)然,如果文件定位不是在一個(gè)紀(jì)錄里面,那么當(dāng)前紀(jì)錄就不存在。當(dāng)文件定位處于當(dāng)前文件時(shí),還可以更加詳細(xì)地描述為定位于當(dāng)前紀(jì)錄的數(shù)據(jù)值序列的初始點(diǎn)或終止點(diǎn),或紀(jì)錄的任意兩個(gè)數(shù)據(jù)值之間。即該紀(jì)錄的緊接在數(shù)據(jù)值序列的第一個(gè)數(shù)據(jù)值前面的位置,或緊接在數(shù)據(jù)值序列的最后一個(gè)數(shù)據(jù)值后面的位置,或在數(shù)據(jù)值序列里面的任意兩個(gè)數(shù)據(jù)值之間的位置?!?/p>
內(nèi)部文件總是在數(shù)據(jù)傳輸之前定位在紀(jì)錄的開(kāi)始位置?!?/p>
預(yù)輸入輸出操作總是以紀(jì)錄為單位的,因此完成這樣一個(gè)操作之后,文件總是定位于一個(gè)紀(jì)錄的終止位置或紀(jì)錄之間的位置;而非預(yù)輸入輸出操作是以字符為單位的,因此完成一個(gè)非預(yù)輸入輸出操作之后,文件有可能定位于當(dāng)前紀(jì)錄的字符序列之間。輸入輸出語(yǔ)句的運(yùn)行總能影響外部文件的定位,根據(jù)作用效果的不同,輸入輸出語(yǔ)句可以分為如下兩種:●
預(yù)輸入輸出語(yǔ)句。一個(gè)預(yù)輸入輸出語(yǔ)句總是在文件的最后一個(gè)紀(jì)錄完成讀寫(xiě)之后對(duì)文件定位,除非中途發(fā)生錯(cuò)誤。●
非預(yù)輸入輸出語(yǔ)句。一個(gè)非預(yù)輸入輸出語(yǔ)句可以定位于當(dāng)前紀(jì)錄里面的字符位置,或者是隨后的紀(jì)錄上面。運(yùn)用非預(yù)輸入輸出語(yǔ)句就可以通過(guò)一個(gè)輸入輸出語(yǔ)句序列讀寫(xiě)文件的紀(jì)錄,其中每個(gè)語(yǔ)句訪問(wèn)紀(jì)錄的一部分。這種語(yǔ)句也可以用來(lái)讀可變長(zhǎng)度的紀(jì)錄。在數(shù)據(jù)傳輸之前的文件的定位在直接訪問(wèn)文件與序列訪問(wèn)文件時(shí)有不同的約定:●
序列輸入時(shí),如果存在當(dāng)前紀(jì)錄,那么文件定位不變;否則文件定位于下一個(gè)紀(jì)錄的頭部,自然該紀(jì)錄就成為了當(dāng)前紀(jì)錄。如果這個(gè)紀(jì)錄不存在,或者在存在當(dāng)前紀(jì)錄,而最近訪問(wèn)文件的數(shù)據(jù)傳輸語(yǔ)句執(zhí)行的是輸出,那么該輸入就不執(zhí)行?!?/p>
如果文件包含文件終止紀(jì)錄,那么在數(shù)據(jù)傳輸之前文件不能定位于文件終止紀(jì)錄后面??梢赃\(yùn)用REWIND語(yǔ)句和BACKSPACE語(yǔ)句來(lái)對(duì)文件重定位?!?/p>
序列輸出時(shí),如果存在當(dāng)前紀(jì)錄,那么文件定位不會(huì)變化,當(dāng)前紀(jì)錄成為文件的最后紀(jì)錄;如果不存在當(dāng)前紀(jì)錄,那么就生成下一個(gè)紀(jì)錄作為文件的當(dāng)前紀(jì)錄,文件定位于該當(dāng)前紀(jì)錄的頭部?!?/p>
如果是直接訪問(wèn),文件的定位情形非常簡(jiǎn)單,即定位于紀(jì)錄說(shuō)明符所指定的紀(jì)錄的頭部。該紀(jì)錄就是文件的當(dāng)前紀(jì)錄。在數(shù)據(jù)傳輸過(guò)程結(jié)束之后,文件的定位有如下幾種情形:●
如果數(shù)據(jù)傳輸過(guò)程了發(fā)生錯(cuò)誤,那么文件定位就是不可預(yù)知的?!?/p>
如果數(shù)據(jù)傳輸過(guò)程沒(méi)有發(fā)生錯(cuò)誤,但是讀入了文件終止紀(jì)錄而導(dǎo)致文件終止,那么文件定位于文件終止紀(jì)錄之后?!?/p>
對(duì)于非預(yù)輸入如果沒(méi)有出現(xiàn)錯(cuò)誤,也沒(méi)有出現(xiàn)文件終止條件,但是出現(xiàn)了紀(jì)錄終止條件,那么文件定位于剛讀入的紀(jì)錄之后;如果紀(jì)錄終止條件也沒(méi)有出現(xiàn),那么文件定位不變?!?/p>
對(duì)于非預(yù)輸出如果沒(méi)有出現(xiàn)錯(cuò)誤,則文件定位不變?!?/p>
在所有的其他情況下,文件定位于剛讀寫(xiě)過(guò)的紀(jì)錄之后,該紀(jì)錄就成為了前紀(jì)錄。16.1.5
內(nèi)部文件內(nèi)部文件的概念是FORTRAN語(yǔ)言的一個(gè)很大的特點(diǎn),它實(shí)現(xiàn)了數(shù)據(jù)從內(nèi)存到內(nèi)存的傳輸與轉(zhuǎn)換的功能。內(nèi)部文件的屬性與約定如下:●
內(nèi)部文件為默認(rèn)字符型變量,不能是帶向量下標(biāo)的數(shù)組片斷?!?/p>
內(nèi)部文件的紀(jì)錄為標(biāo)量字符變量?!?/p>
如果文件本身就是一個(gè)標(biāo)量字符變量,那么該文件就只包含一個(gè)紀(jì)錄,其長(zhǎng)度就是標(biāo)量字符變量的長(zhǎng)度。如果內(nèi)部文件是一個(gè)字符數(shù)組,那么它就被看成是一個(gè)字符數(shù)組元素的序列,其中的每個(gè)元素都是該文件的一個(gè)紀(jì)錄,該文件紀(jì)錄的順序就是該數(shù)組或數(shù)組片斷的數(shù)組元素序,該文件的每個(gè)紀(jì)錄的長(zhǎng)度都相同,即數(shù)組元素的長(zhǎng)度?!?/p>
寫(xiě)入內(nèi)部文件紀(jì)錄的同時(shí)就定義了該紀(jì)錄。如果寫(xiě)入字符數(shù)目少于紀(jì)錄長(zhǎng)度,那么紀(jì)錄多余的空間就被填上空字符。寫(xiě)入的字符數(shù)目不能超過(guò)紀(jì)錄長(zhǎng)度。●
只有在內(nèi)部文件的紀(jì)錄被定義之后,才能讀入該紀(jì)錄?!?/p>
內(nèi)部文件的紀(jì)錄除了通過(guò)輸入語(yǔ)句之外,還可以使用其他方法得到定義或去定義,例如字符賦值語(yǔ)句也能夠定義作為紀(jì)錄的字符變量?!?/p>
在數(shù)據(jù)傳輸之前,內(nèi)部文件總是定位于第一個(gè)紀(jì)錄的頭部,而該紀(jì)錄就是當(dāng)前紀(jì)錄?!?/p>
在輸入內(nèi)部文件時(shí),對(duì)空格的處理與使用具有值NULL的說(shuō)明符BLANK=來(lái)打開(kāi)外部文件一樣,在必要的時(shí)候紀(jì)錄可以添加空格?!?/p>
在表控輸出時(shí),字符常量不能定界。●
內(nèi)部文件紀(jì)錄的讀與寫(xiě)只能通過(guò)不說(shuō)明名稱列表格式的序列訪問(wèn)格式化輸入輸出語(yǔ)句來(lái)完成。●
內(nèi)部文件不能出現(xiàn)在文件聯(lián)結(jié)語(yǔ)句,文件定位語(yǔ)句以及文件查詢語(yǔ)句當(dāng)中。16.2
文件的部件聯(lián)結(jié)與訪問(wèn)程序要和文件進(jìn)行通訊,都需要程序通過(guò)一定的部件聯(lián)結(jié)到文件,即通過(guò)部件輸出數(shù)據(jù)到文件,通過(guò)部件從文件輸入數(shù)據(jù)到程序。這里的所謂部件是一個(gè)純粹的邏輯概念,而不是一個(gè)物理概念,之所以要引入這么一個(gè)邏輯概念,主要的原因就是為了在語(yǔ)言里獲得對(duì)輸入輸出的通用描述。因?yàn)槲覀冎牢募拍顚?shí)際上是與操作系統(tǒng)與硬件存儲(chǔ)形式密切相關(guān)的,不同的操作系統(tǒng)與硬件存儲(chǔ)形式里面,對(duì)于文件往往有不同的形式約定,因此為了使得對(duì)輸入輸出能夠有不依賴于具體系統(tǒng)的描述,F(xiàn)ORTRAN引入了部件這個(gè)邏輯概念作為數(shù)據(jù)從程序到文件之間的橋梁。部件使用如下的語(yǔ)法表示方法(R901):
io-unit其中的輸入輸出部件(io-unit)可以具有如下三種形式之一:
external-file-unit
*
internal-file-unit其中外部文件部件的表示形式為標(biāo)量整型表達(dá)式或者是一個(gè)星號(hào),而內(nèi)部文件部件的表示形式為默認(rèn)字符型變量。部件的一般規(guī)則如下:●表示內(nèi)部文件部件的默認(rèn)字符型變量不能是帶有向量下標(biāo)的數(shù)組片斷?!褚粋€(gè)部件可以作為外部部件也可以作為內(nèi)部部件。外部部件用來(lái)聯(lián)結(jié)外部文件;而內(nèi)部部件用來(lái)聯(lián)結(jié)內(nèi)部文件?!袢绻硎緝?nèi)部文件部件的字符型變量是指針,那么該指針必須是獲得了關(guān)聯(lián)的?!袢绻硎緝?nèi)部文件部件的字符型變量是一個(gè)可分配數(shù)組,或者這樣一個(gè)數(shù)組的子對(duì)象,那么該數(shù)組必須是當(dāng)前可分配的。●表示外部文件部件的標(biāo)量整型表達(dá)式必須是0或正整數(shù)?!癯霈F(xiàn)在文件聯(lián)結(jié)語(yǔ)句,文件定位語(yǔ)句,以及文件查詢語(yǔ)句當(dāng)中的輸入輸出部件只能表示外部文件部件。●在一個(gè)程序的所有程序單位里面,一個(gè)表示外部文件部件的標(biāo)量整型表達(dá)式的值,表示同一個(gè)外部部件?!裥翘?hào)表示預(yù)先聯(lián)結(jié)用來(lái)進(jìn)行格式化序列訪問(wèn)的特定的與系統(tǒng)相關(guān)的外部部件?!駥?duì)于一個(gè)給定程序,在任意的時(shí)間總是存在一個(gè)與系統(tǒng)相關(guān)的外部部件集合。所有的輸入輸出語(yǔ)句都可以使用存在的部件,而INQUIRE語(yǔ)句和CLOSE語(yǔ)句還可以使用不存在的部件?!纠?6-1】
SUBROUTINEAREAD(6)X...SUBROUTINEBN=6REWINDN在這個(gè)程序例子里面,兩個(gè)不同的程序單位里面出現(xiàn)的外部部件名稱6表示同一個(gè)外部部件。16.2.1
文件到部件的聯(lián)結(jié)與預(yù)聯(lián)結(jié)一個(gè)外部部件可以被聯(lián)結(jié),也可以不被聯(lián)結(jié),這兩種狀態(tài)都是合法的。外部部件通過(guò)預(yù)聯(lián)結(jié)或通過(guò)使用OPEN語(yǔ)句而獲得與一個(gè)外部文件的聯(lián)結(jié),正是這種聯(lián)結(jié)使得外部文件能夠被程序訪問(wèn)。這種訪問(wèn)也就是輸入輸出語(yǔ)句的功能所在,或者準(zhǔn)確地說(shuō)是除了OPEN語(yǔ)句,CLOSE語(yǔ)句,以及INQUIRE語(yǔ)句之外的所有輸入輸出語(yǔ)句因此而能夠通過(guò)外部部件而訪問(wèn)相應(yīng)的外部文件或?qū)ο鄳?yīng)的外部文件進(jìn)行操作。文件到部件的聯(lián)結(jié)與預(yù)聯(lián)結(jié)的一般規(guī)則如下:●一個(gè)文件可以與部件建立聯(lián)結(jié)但本身卻還不存在,例如一個(gè)已經(jīng)建立了預(yù)聯(lián)結(jié)的文件,但可能還沒(méi)有被寫(xiě)入?!褚粋€(gè)部件在同一個(gè)時(shí)間不能聯(lián)結(jié)多于一個(gè)文件;而一個(gè)文件也不能在同一個(gè)時(shí)間與多于一個(gè)的部件相聯(lián)結(jié)?!駡?zhí)行CLOSE語(yǔ)句之后,相關(guān)的外部部件就失去了聯(lián)結(jié),然后在同一個(gè)程序單位里面,該部件仍然可以根據(jù)程序的需要再次與同一個(gè)文件或不同的文件建立聯(lián)結(jié)。類似的,執(zhí)行CLOSE語(yǔ)句之后,相關(guān)的外部文件也失去了聯(lián)結(jié),然后在同一個(gè)程序單位里面,該文件仍然可以根據(jù)程序的需要而再次與同一個(gè)部件或不同的設(shè)備建立聯(lián)結(jié)?!褚坏┮粋€(gè)文件失去了聯(lián)結(jié),那么再次引用該文件的唯一方法就是在OPEN語(yǔ)句或INQUIRE語(yǔ)句里面引用該文件的名稱,而如果失去聯(lián)結(jié)的文件沒(méi)有名稱,那么就無(wú)法使得它再次獲得聯(lián)結(jié)?!駥?duì)于內(nèi)部部件來(lái)說(shuō),總聯(lián)結(jié)到由標(biāo)志該部件的默認(rèn)字符型變量所給出的內(nèi)部文件?!褚坏┎考c文件建立了聯(lián)結(jié),那么也就意味著建立了訪問(wèn)的方法,或者是序列訪問(wèn),或者是直接訪問(wèn)?!褚坏┡c一個(gè)已經(jīng)存在的文件,或者是通過(guò)聯(lián)結(jié)而生成的新文件建立聯(lián)結(jié),那么就會(huì)建立相應(yīng)的格式化或非格式的數(shù)據(jù)格式。如果聯(lián)結(jié)是通過(guò)執(zhí)行OPEN語(yǔ)句而建立的,那么在沒(méi)有指定數(shù)據(jù)格式的情形下給出默認(rèn)數(shù)據(jù)格式;如果聯(lián)結(jié)為預(yù)聯(lián)結(jié)到一個(gè)已經(jīng)存在的文件,那么數(shù)據(jù)格式由預(yù)聯(lián)結(jié)建立;如果預(yù)聯(lián)結(jié)到一個(gè)不存在的文件,那么數(shù)據(jù)格式可以建立,也可以推遲到文件生成之后再建立,例如運(yùn)行格式化或非格式的WRITE語(yǔ)句之后。16.2.2
OPEN語(yǔ)句OPEN語(yǔ)句的功能就是建立初始的外部文件與指定部件之間的聯(lián)結(jié),或者是修改該聯(lián)結(jié)。具體地說(shuō),一個(gè)OPEN語(yǔ)句可以產(chǎn)生如下幾種作用:●
聯(lián)結(jié)一個(gè)已經(jīng)存在的文件到部件;●
產(chǎn)生一個(gè)已經(jīng)預(yù)聯(lián)結(jié)的文件;●
產(chǎn)生一個(gè)新的文件然后把它聯(lián)結(jié)到指定部件;●
改變一個(gè)文件與部件之間聯(lián)結(jié)的特定說(shuō)明符。OPEN語(yǔ)句的語(yǔ)法形式(R904)為:
OPEN(connect-spec-list)其中的聯(lián)結(jié)說(shuō)明(connect-spec)的語(yǔ)法形式(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其中的文件名稱表達(dá)式(file-name-expr)為標(biāo)量默認(rèn)字符型表達(dá)式(R906)。OPEN語(yǔ)句的一般規(guī)則為:●
如果在部件說(shuō)明符里面省略可選字符UNIT=,那么聯(lián)結(jié)說(shuō)明列表(connect-spec-list)的第一項(xiàng)必須是部件說(shuō)明符?!?/p>
在一個(gè)給定OPEN語(yǔ)句里面,任何說(shuō)明符都至多只能出現(xiàn)一次;其中必須給出外部文件部件(external-file-unit)?!?/p>
在說(shuō)明符ERR=里面給出的語(yǔ)句標(biāo)簽必須是與該OPEN語(yǔ)句同一個(gè)作用域單位里面的分支目標(biāo)語(yǔ)句的標(biāo)簽?!?/p>
如果說(shuō)明符STATUS=的值為NEW或REPLACE,那么說(shuō)明符FILE=必須同時(shí)給出。如果說(shuō)明符STATUS=的值為SCRATCH,那么說(shuō)明符FILE=不能同時(shí)出現(xiàn)。如果說(shuō)明符STATUS=的值為OLD,那么說(shuō)明符FILE=必須出現(xiàn),除非部件當(dāng)前聯(lián)結(jié)到一個(gè)文件,并且該文件存在?!?/p>
說(shuō)明符當(dāng)中出現(xiàn)的標(biāo)量默認(rèn)字符表達(dá)式為字符的有限列表,尾部的空格被忽略。如果系統(tǒng)同時(shí)支持大小寫(xiě),那么字符取值不區(qū)分大小寫(xiě)?!?/p>
在一個(gè)程序的任意程序單位里面,一旦一個(gè)外部部件通過(guò)OPEN語(yǔ)句獲得聯(lián)結(jié),那么在該程序的任意程序單位里面都可以引用該部件?!?/p>
如果一個(gè)部件已經(jīng)聯(lián)結(jié)到一個(gè)存在的文件,仍然可以對(duì)該部件執(zhí)行OPEN語(yǔ)句。如果在該OPEN語(yǔ)句當(dāng)中不包含F(xiàn)ILE=說(shuō)明符,那么與該部件聯(lián)結(jié)的文件就是已經(jīng)與該部件聯(lián)結(jié)的文件?!?/p>
如果與部件聯(lián)結(jié)的文件并不存在,但是和已經(jīng)與部件預(yù)聯(lián)結(jié)的文件相同,那么由OPEN語(yǔ)句給出的屬性成為聯(lián)結(jié)的一部分?!?/p>
如果通過(guò)OPEN語(yǔ)句聯(lián)結(jié)到部件的文件與已經(jīng)與部件聯(lián)結(jié)的文件不同,那么這個(gè)OPEN語(yǔ)句的執(zhí)行效果相當(dāng)于:在執(zhí)行OPEN語(yǔ)句之前,馬上執(zhí)行一個(gè)不帶有STATUS=說(shuō)明符的CLOSE語(yǔ)句?!?/p>
如果通過(guò)OPEN語(yǔ)句聯(lián)結(jié)到部件的文件與已經(jīng)與部件聯(lián)結(jié)的文件相同,只是當(dāng)前起作用的BLANK=,DELIM=,PAD=,ERR=,以及IOSTAT=這些說(shuō)明符的值不同,那么會(huì)產(chǎn)生如下后果:●
如果OPEN語(yǔ)句當(dāng)中包含POSITION=說(shuō)明符,那么它的值可能與文件的當(dāng)前定位不符?!?/p>
如果OPEN語(yǔ)句當(dāng)中包含STATUS=說(shuō)明符,那么它的值為OLD。●
BLANK=,DELIM=,PAD=這些說(shuō)明符的值發(fā)生作用,而其他沒(méi)有出現(xiàn)的說(shuō)明符不會(huì)發(fā)生變化,文件的定位也不會(huì)發(fā)生變化?!?/p>
此前執(zhí)行的任何OPEN語(yǔ)句的ERR=,以及IOSTAT=這些說(shuō)明符對(duì)當(dāng)前執(zhí)行的OPEN語(yǔ)句沒(méi)有影響?!?/p>
如果通過(guò)OPEN語(yǔ)句聯(lián)結(jié)到部件的文件與已經(jīng)與部件聯(lián)結(jié)的文件相同,那么具有值OLD的說(shuō)明符STATUS=總是合法的,這時(shí)如果文件在執(zhí)行OPEN語(yǔ)句之前的狀態(tài)為SCRATCH,那么在部件關(guān)閉后,文件被刪除,并且認(rèn)為具有SCRATCH狀態(tài)?!?/p>
如果一個(gè)文件已經(jīng)與一個(gè)部件建立聯(lián)結(jié),那么對(duì)該文件運(yùn)用OPEN語(yǔ)句使其與另外一個(gè)不同的部件建立聯(lián)結(jié)是非法的?!纠?6-2】OPEN(10,FILE='s',ACTION='READ',PAD='YES')下面更加詳細(xì)地說(shuō)明OPEN語(yǔ)句當(dāng)中所使用的各種說(shuō)明符的含義。1FILE=●
說(shuō)明符FILE=的值就是與給定部件聯(lián)結(jié)的文件的名稱。它尾部的所有空格都被忽略。而文件名稱表達(dá)式必須是系統(tǒng)的合法名稱?!?/p>
如果在OPEN語(yǔ)句當(dāng)中省略該說(shuō)明符,并且部件也沒(méi)有與文件建立聯(lián)結(jié),那么說(shuō)明符STATUS=給出值SCRATCH,這時(shí)部件聯(lián)結(jié)一個(gè)依賴具體系統(tǒng)的文件。2STATUS=●
其中的標(biāo)量默認(rèn)字符表達(dá)式取值為OLD,NEW,SCRATCH,REPLACE,以及UNKNOWN。●
當(dāng)說(shuō)明符取值為OLD時(shí),文件存在,而取值為NEW時(shí),則文件不存在。●
當(dāng)具有值NEW的OPEN語(yǔ)句成功運(yùn)行之后,生成相應(yīng)的文件,然后狀態(tài)自然轉(zhuǎn)變?yōu)镺LD。●
當(dāng)取值為REPLACE時(shí),如果文件不存在,那么OPEN語(yǔ)句生成一個(gè)新文件,然后狀態(tài)取為OLD;而如果文件已經(jīng)存在,則該文件被刪除,OPEN語(yǔ)句生成一個(gè)新文件,具有與被刪除文件相同的文件名稱,然后狀態(tài)取為OLD。●
如果取值為SCRATCH,則生成文件并聯(lián)結(jié)到指定的部件,以供程序使用,然后在執(zhí)行引用同一個(gè)部件的CLOSE語(yǔ)句之后,或者是程序終止之后,該文件被刪除?!?/p>
SCRATCH不能用于命名文件?!?/p>
如果取值為UNKNOWN,則具體的狀態(tài)依賴于系統(tǒng)的約定。如果說(shuō)明符被省略了,則默認(rèn)值就是UNKNOWN。3ACCESS=●
其中標(biāo)量默認(rèn)字符表達(dá)式的取值為SEQUENTIAL或DIRECT。分別表示文件聯(lián)結(jié)的訪問(wèn)方法為序列訪問(wèn)或直接訪問(wèn)?!?/p>
如果該說(shuō)明符被省略,則默認(rèn)取值為SEQUENTIAL?!?/p>
如果聯(lián)結(jié)文件已經(jīng)存在,那么該說(shuō)明符指定的訪問(wèn)方法必須對(duì)于該文件是合法的?!?/p>
如果文件不存在而需要生成新文件,那么說(shuō)明符指定的訪問(wèn)方法必須對(duì)于該新文件是合法的。4FORM=●
其中標(biāo)量默認(rèn)字符表達(dá)式取值為FORMATTED或UNFORMATTED。分別表示文件聯(lián)結(jié)為格式化輸入輸出或無(wú)格式輸入輸出。●
如果該說(shuō)明符被省略了,那么在文件聯(lián)結(jié)為直接訪問(wèn)時(shí),默認(rèn)值為UNFORMATTED;而如果文件聯(lián)結(jié)為序列訪問(wèn)時(shí),默認(rèn)值為FORMATTED?!?/p>
如果聯(lián)結(jié)文件已經(jīng)存在,那么該說(shuō)明符指定的格式必須對(duì)于該文件是合法格式?!?/p>
如果文件不存在而需要生成新文件,那么說(shuō)明符指定的格式必須對(duì)于該新文件是合法格式。5RECL=●
該說(shuō)明符的取值必須為正整數(shù)。在文件聯(lián)結(jié)為直接訪問(wèn)的情況下,該取值表示文件的每個(gè)紀(jì)錄的長(zhǎng)度;在文件聯(lián)結(jié)為序列訪問(wèn)的情況下,該數(shù)值表示文件的所有紀(jì)錄當(dāng)中最大的長(zhǎng)度?!?/p>
在文件聯(lián)結(jié)為直接訪問(wèn)時(shí),該說(shuō)明符必須給出?!?/p>
在文件聯(lián)結(jié)為序列訪問(wèn)時(shí),該說(shuō)明符可以省略,默認(rèn)值依賴于系統(tǒng)的約定?!?/p>
如果文件聯(lián)結(jié)為格式化輸入輸出,那么取值為只包含默認(rèn)字符型字符的紀(jì)錄的字符數(shù)目。如果紀(jì)錄里面包含了非默認(rèn)字符型,那么該說(shuō)明符的取值依賴于系統(tǒng)的約定。●
如果文件聯(lián)結(jié)為無(wú)格式輸入輸出,那么紀(jì)錄長(zhǎng)度由系統(tǒng)約定的度量單位來(lái)決定具體數(shù)值?!?/p>
如果聯(lián)結(jié)文件已經(jīng)存在,那么該說(shuō)明符指定的長(zhǎng)度必須對(duì)于該文件是合法長(zhǎng)度?!?/p>
如果文件不存在而需要生成新文件,那么說(shuō)明符指定的長(zhǎng)度必須對(duì)于該新文件是合法長(zhǎng)度。6BLANK=●
其中標(biāo)量默認(rèn)字符表達(dá)式的取值為NULL或ZERO?!?/p>
BLANK=說(shuō)明符只能用于格式化輸入輸出的文件聯(lián)結(jié)。●
如果取值為NULL,那么在給定部件的數(shù)值格式化輸入域里面的所有空格字符都被忽略,除非全部為空格的域具有零值?!?/p>
如果取值為ZERO,那么除了頭部的空格之外,所有其他空格都被視為0?!?/p>
如果該說(shuō)明符省略了,那么默認(rèn)值為NULL。7.POSITION=●
其中標(biāo)量默認(rèn)字符表達(dá)式的取值為ASIS,REWIND,或APPEND。該說(shuō)明符只能用于序列訪問(wèn)的聯(lián)結(jié)。●
一個(gè)新生成的文件總是定位于初始點(diǎn)。●
REWIND使得一個(gè)已經(jīng)存在的文件定位于它的初始點(diǎn)?!?/p>
APPEND使得一個(gè)已經(jīng)存在的文件定位于文件終止紀(jì)錄的前紀(jì)錄,而如果該文件不包含文件終止紀(jì)錄,則定位于該文件的終止點(diǎn)。●
如果文件存在并且已經(jīng)聯(lián)結(jié),那么ASIS使得它的定位不變,而如果文件存在但沒(méi)有聯(lián)結(jié),那么ASIS表示它的定位未知。如果該說(shuō)明符被省略,那么默認(rèn)值為ASIS。8.ACTION=●
其中標(biāo)量默認(rèn)字符表達(dá)式可以取值為READ,WRITE,READWRITE?!?/p>
取值READ表示W(wǎng)RITE,PRINT,以及ENDFILE語(yǔ)句都不能引用該聯(lián)結(jié)?!?/p>
取值WRITE表示READ語(yǔ)句不能引用該聯(lián)結(jié)。●
取值READWRITE表示任何輸入輸出語(yǔ)句都可以引用該聯(lián)結(jié)?!?/p>
如果該說(shuō)明符省略了,則默認(rèn)值依賴于系統(tǒng)的約定。●
如果文件的合法操作里面包含了READWRITE,那么也應(yīng)該包含READ和WRITE?!?/p>
如果聯(lián)結(jié)文件已經(jīng)存在,那么該說(shuō)明符指定的操作必須對(duì)于該文件是合法操作?!?/p>
如果文件不存在而需要生成新文件,那么說(shuō)明符指定的操作必須對(duì)于該新文件是合法操作。9.DELIM=●
該說(shuō)明符只能用于具有格式化輸入輸出聯(lián)結(jié)的文件。在輸入格式化紀(jì)錄時(shí)該說(shuō)明符被忽略?!?/p>
其中標(biāo)量默認(rèn)字符表達(dá)式可以取值為APOSTROPHE,QUOTE,NONE?!?/p>
如果取值為APOSTROPHE,則表控或名稱列表格式寫(xiě)入的字符值的分隔必須使用撇號(hào);而內(nèi)部撇號(hào)則必須使用雙撇號(hào)。●
如果取值為QUOTE,那么表控或名稱列表格式寫(xiě)入的字符值的分隔必須使用引號(hào);而內(nèi)部引號(hào)則必須使用雙引號(hào)?!?/p>
如果取值為NONE,那么寫(xiě)入字符不能使用撇號(hào)或引號(hào)作為分隔標(biāo)志,內(nèi)部撇號(hào)或引號(hào)也不能是雙的。●
如果該說(shuō)明符被省略了,那么默認(rèn)取值為NONE。10.PAD=●
該說(shuō)明符只能用于具有格式化輸入輸出聯(lián)結(jié)的文件。在格式化紀(jì)錄輸出時(shí),該說(shuō)明符被忽略?!?/p>
其中的標(biāo)量默認(rèn)字符表達(dá)式可以取值為YES,NO?!?/p>
如果取值為YES,那么在給出了輸入列表,并且格式說(shuō)明要求紀(jì)錄包含比它本來(lái)具有的數(shù)據(jù)更多的數(shù)據(jù)時(shí),該格式化輸入紀(jì)錄可以在尾部添加足夠的空格。●
如果取值為NO,那么輸入列表以及格式說(shuō)明都不能要求紀(jì)錄具有比它本來(lái)具有的數(shù)據(jù)更多的數(shù)據(jù)。●
如果該說(shuō)明符被省略,那么默認(rèn)取值為YES?!?/p>
對(duì)于非默認(rèn)字符型數(shù)據(jù),對(duì)于附加的空格字符由系統(tǒng)約定。16.2.3
CLOSE語(yǔ)句CLOSE語(yǔ)句的功能為終止一個(gè)給定部件到一個(gè)外部文件的聯(lián)結(jié)。CLOSE語(yǔ)句的一般語(yǔ)法形式(R907)為:
CLOSE(close-spec-list)其中的關(guān)閉說(shuō)明(close-spec)可以是如下幾種形式(R908)之一:[UNIT=]external-file-unitIOSTAT=scalar-default-int-variableERR=labelSTATUS=scalar-default-char-exprCLOSE語(yǔ)句的一般規(guī)則為:●
如果在部件說(shuō)明當(dāng)中省略了字符UNIT=,那么部件說(shuō)明符必須是關(guān)閉說(shuō)明列表的第一項(xiàng).●
在一個(gè)給定關(guān)閉說(shuō)明里面,任何說(shuō)明符都只能出現(xiàn)一次,其中必須給出外部文件部件?!?/p>
出現(xiàn)在說(shuō)明符ERR=當(dāng)中的語(yǔ)句標(biāo)簽,必須是在和CLOSE語(yǔ)句同一個(gè)作用域單位里面的分支目標(biāo)語(yǔ)句的標(biāo)簽?!?/p>
其中的標(biāo)量默認(rèn)字符表達(dá)式取值為字符型數(shù)據(jù),其尾部的空格都被忽略。如果系統(tǒng)同時(shí)支持大小寫(xiě),那么不區(qū)分字符的大小寫(xiě)?!?/p>
在程序的任何程序單位里面都可以對(duì)某個(gè)部件執(zhí)行CLOSE語(yǔ)句,但是不能在同一個(gè)作用域單位里面和OPEN語(yǔ)句作用于同一個(gè)部件?!?/p>
針對(duì)一個(gè)不存在的部件,或者是一個(gè)沒(méi)有與文件聯(lián)結(jié)的部件執(zhí)行CLOSE語(yǔ)句是合法的,但是不影響任何文件?!?/p>
在一個(gè)作用域單位里面,如果一個(gè)部件被CLOSE語(yǔ)句關(guān)閉聯(lián)結(jié)之后,仍然可以再次和原來(lái)的文件,或者是另外的文件建立聯(lián)結(jié)?!?/p>
在一個(gè)作用域單位里面,如果一個(gè)命名文件被CLOSE語(yǔ)句關(guān)閉聯(lián)結(jié),那么它仍然可以在該程序單位里面和同一個(gè)部件,或者另外的部件建立聯(lián)結(jié),只要該文件一直存在?!?/p>
程序的執(zhí)行正常終止之后,所有的部件聯(lián)結(jié)都被關(guān)閉。如果在終止之前文件狀態(tài)為SCRATCH,那么關(guān)閉之后部件狀態(tài)為DELETE;其他情形下關(guān)閉之后的部件狀態(tài)為KEEP?!纠?6-3】
CLOSE(10,STATUS='KEEP')CLOSE語(yǔ)句的STATUS=說(shuō)明符遵循如下規(guī)則:●
其中的標(biāo)量默認(rèn)字符表達(dá)式可以取值為KEEP,DELETE,分別表示是否保留與給定部件聯(lián)結(jié)的文件?!?/p>
KEEP不能用于在執(zhí)行CLOSE語(yǔ)句之前狀態(tài)為SCRATCH的文件?!?/p>
如果KEEP用于一個(gè)存在的文件,那么在執(zhí)行CLOSE語(yǔ)句之后,該文件繼續(xù)存在?!?/p>
如果KEEP用于一個(gè)不存在的文件,那么在執(zhí)行CLOSE語(yǔ)句之后,該文件仍然不存在?!?/p>
如果取值為DELETE,那么在執(zhí)行CLOSE語(yǔ)句之后,文件不再存在。●
如果該說(shuō)明符被省略,那么默認(rèn)值為KEEP,除非文件在執(zhí)行CLOSE語(yǔ)句之前狀態(tài)為SCRATCH,如果出現(xiàn)那種情況,則默認(rèn)值為DELETE。16.3
文件的傳輸文件傳輸語(yǔ)句包括如下三種:●
READ語(yǔ)句,為數(shù)據(jù)輸入語(yǔ)句;●
WRITE語(yǔ)句和PRINT語(yǔ)句,為數(shù)據(jù)輸出語(yǔ)句。READ語(yǔ)句的一般語(yǔ)法形式(R909)為以下兩種形式之一:READ(io-control-spec-list)[input-item-list]READformat[,input-item-list]WRITE語(yǔ)句的一般語(yǔ)法形式(R910)為:WRITE(io-control-spec-list)[output-item-list]PRINT語(yǔ)句的一般語(yǔ)法形式(R911)為:PRINTformat[,output-item-list]對(duì)于其中的輸入輸出控制說(shuō)明列表(io-control-spec-list)和數(shù)據(jù)輸入輸出項(xiàng)列表(input/output-item-list)在下面分節(jié)予以說(shuō)明?!纠?6-4】READ(6,*)SIZEREAD10,A,BWRITE(6,10)A,S,JPRINT10,A,S,J10FORMAT(2E16.3,I5)16.3.1
控制信息列表所謂輸入輸出控制說(shuō)明列表就是控制信息列表,用來(lái)控制數(shù)據(jù)的傳輸,包括如下的成分:●
數(shù)據(jù)傳輸?shù)脑椿蚰繕?biāo);●
可選的編輯過(guò)程的說(shuō)明;●
可選的確定紀(jì)錄的說(shuō)明;●
可選的對(duì)于需要排除的操作的說(shuō)明;●
可選的狀態(tài)返回;●
可選的紀(jì)錄預(yù)說(shuō)明;●
可選的讀入字符數(shù)目返回。輸入輸出控制說(shuō)明的一般語(yǔ)法形式(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ù)傳輸語(yǔ)句可以分為兩種:●
如果數(shù)據(jù)傳輸語(yǔ)句包含了格式說(shuō)明或名稱列表集合名稱,那么該語(yǔ)句就屬于格式化輸入輸出語(yǔ)句?!?/p>
否則就屬于無(wú)格式輸入輸出語(yǔ)句??刂菩畔⒘斜淼囊话阋?guī)則為:●
在上面列舉的輸入輸出控制說(shuō)明當(dāng)中必須包含一個(gè),也至多包含一個(gè)輸入輸出部件,而其他的說(shuō)明選項(xiàng)至多出現(xiàn)一次?!?/p>
在WRITE語(yǔ)句當(dāng)中不能出現(xiàn)END=,EOR=,以及SIZE=說(shuō)明符?!?/p>
出現(xiàn)在說(shuō)明符ERR=,EOR=,以及END=里面的語(yǔ)句標(biāo)簽必須該數(shù)據(jù)傳輸語(yǔ)句所在的作用域單位里面的分支目標(biāo)語(yǔ)句的標(biāo)簽?!?/p>
如果在數(shù)據(jù)傳輸語(yǔ)句當(dāng)中出現(xiàn)了輸入輸出項(xiàng)列表,那么就不能同時(shí)出現(xiàn)名稱列表集合名稱。●
一個(gè)輸入輸出控制說(shuō)明列表里面不能同時(shí)包含一個(gè)格式說(shuō)明和一個(gè)名稱列表集合名稱。●
如果部件說(shuō)明符里面省略了字符UNIT=,那么控制信息列表的第一項(xiàng)必須是部件說(shuō)明符?!?/p>
如果在格式說(shuō)明符里面省略了字符FMT=,那么控制信息列表的第二項(xiàng)必須是格式說(shuō)明符,而控制信息列表的第一項(xiàng)必須是不帶可選字符UNIT=的部件說(shuō)明符?!?/p>
如果在名稱列表說(shuō)明符里面省略了字符NML=,那么控制信息列表的第二項(xiàng)必須是名稱列表說(shuō)明符,而控制信息列表的第一項(xiàng)必須是不帶可選字符UNIT=的部件說(shuō)明符?!?/p>
如果部件說(shuō)明符給出的是一個(gè)內(nèi)部文件,那么輸入輸出控制說(shuō)明列表不能包含說(shuō)明符REC=,也不能包含名稱列表集合名稱?!?/p>
如果語(yǔ)句當(dāng)中給出了說(shuō)明符REC=,那么其中就不能出現(xiàn)說(shuō)明符END=和名稱列表集合名稱,如果出現(xiàn)格式說(shuō)明,則不能是星號(hào)表示的表控輸入輸出?!?/p>
說(shuō)明符ADVANCE=只能出現(xiàn)在具有顯式格式說(shuō)明的格式化序列輸入輸出語(yǔ)句里面,其控制信息列表不包含內(nèi)部文件的部件說(shuō)明符?!?/p>
如果出現(xiàn)了EOR=說(shuō)明符,那么說(shuō)明符ADVANCE=也必須同時(shí)出現(xiàn)?!?/p>
如果出現(xiàn)了SIZE=說(shuō)明符,那么說(shuō)明符ADVANCE=也必須同時(shí)出現(xiàn)?!?/p>
說(shuō)明符SIZE=只能出現(xiàn)在包含取值為NO的說(shuō)明符ADVANCE=的輸入語(yǔ)句當(dāng)中?!?/p>
說(shuō)明符EOR=只能出現(xiàn)在包含取值為NO的說(shuō)明符ADVANCE=的輸入語(yǔ)句當(dāng)中?!?/p>
如果數(shù)據(jù)傳輸語(yǔ)句的IOSTAT=或SIZE=說(shuō)明符里面給出了變量,那么該變量不能關(guān)聯(lián)于數(shù)據(jù)傳輸輸入輸出列表里面的任何數(shù)據(jù)對(duì)象,也不能關(guān)聯(lián)于名稱列表集合對(duì)象列表里面的任何數(shù)據(jù)對(duì)象,也不能關(guān)聯(lián)于數(shù)據(jù)傳輸輸入輸出列表里面的隱式輸入輸出do結(jié)構(gòu)里的do變量?!?/p>
在數(shù)據(jù)傳輸語(yǔ)句里面,如果由說(shuō)明符IOSTAT=或者說(shuō)明符SIZE=給出的變量為數(shù)組元素引用,那么數(shù)據(jù)傳輸,隱式輸入輸出do過(guò)程,或者在輸入輸出控制說(shuō)明列表里面的其他說(shuō)明符定義或賦值,都不影響其下標(biāo)值。【例16-5】下面給出一個(gè)READ語(yǔ)句的例子。
READ(IOSTAT=IOS,UNIT=6,FMT='(10F8.2)')A,B下面我們分節(jié)說(shuō)明控制信息列表的各種說(shuō)明符以及相關(guān)內(nèi)容。1.格式說(shuō)明符FMT=說(shuō)明符FMT=的功能為在格式化輸入輸出語(yǔ)句當(dāng)中提供格式說(shuō)明,或提供表控格式。它的一般語(yǔ)法形式(R913)為default-char-exprlabel其中的標(biāo)簽(label)必須是出現(xiàn)在同一個(gè)作用域單位里面的包含了格式說(shuō)明符的作為FORMAT語(yǔ)句的標(biāo)簽。其中的默認(rèn)字符表達(dá)式(default-char-expr)表示一個(gè)有效的格式說(shuō)明。該表達(dá)式也可以是一個(gè)特殊的字符常量,注意參考第7章里面對(duì)于表達(dá)式的說(shuō)明。如果該表達(dá)式是一個(gè)數(shù)組的形式,那么可以把該數(shù)組看成是所有的數(shù)組元素按照數(shù)組元素序串聯(lián)起來(lái)。如果格式表示是其中的星號(hào)*,那么該語(yǔ)句就是所謂的表控輸入輸出語(yǔ)句?!纠?6-6】
READ(6,FMT="("http://CHAR_FMT//")")X,Y,Z在這個(gè)例子里面格式為字符表達(dá)式,其中CHAR_FMT為一個(gè)默認(rèn)字符變量。2.名稱列表說(shuō)明符NML=說(shuō)明符NML=給出名稱列表集合名稱。該名稱表示了一個(gè)需要進(jìn)行數(shù)據(jù)傳輸操作的數(shù)據(jù)對(duì)象的集合。如果語(yǔ)句當(dāng)中給出了這個(gè)名稱列表集合名稱,那么該語(yǔ)句就是所謂名稱列表輸入輸出語(yǔ)句。3.紀(jì)錄數(shù)說(shuō)明符REC=紀(jì)錄數(shù)說(shuō)明符TheREC=給出需要讀寫(xiě)的紀(jì)錄的數(shù)目。該說(shuō)明符只能用于針對(duì)直接訪問(wèn)聯(lián)結(jié)部件的輸入輸出語(yǔ)句,因此這個(gè)說(shuō)明符可以說(shuō)是一個(gè)標(biāo)志性的東西,即只要控制信息列表里面包含了REC=說(shuō)明符,那么該語(yǔ)句就是所謂直接訪問(wèn)輸入輸出語(yǔ)句,否則就是所謂序列訪問(wèn)輸入輸出語(yǔ)句。4.輸入輸出狀態(tài)說(shuō)明符IOSTAT=執(zhí)行一個(gè)包含了IOSTAT=說(shuō)明符的輸入輸出語(yǔ)句實(shí)際上也就是定義了在IOSTAT=說(shuō)明符里面給出的變量。該變量的取值情況有如下幾種:●
如果語(yǔ)句執(zhí)行過(guò)程當(dāng)中沒(méi)有出現(xiàn)錯(cuò)誤條件,也沒(méi)有出現(xiàn)文件終止條件和紀(jì)錄終止條件,那么變量取值為0?!?/p>
如果出現(xiàn)錯(cuò)誤條件,那么取值為系統(tǒng)約定的正整數(shù)值?!?/p>
如果出現(xiàn)文件終止條件,而沒(méi)有出現(xiàn)錯(cuò)誤條件,那么取值為系統(tǒng)約定的負(fù)整數(shù)值?!?/p>
如果出現(xiàn)紀(jì)錄終止條件,而沒(méi)有出現(xiàn)錯(cuò)誤條件與文件終止條件,那么取值為系統(tǒng)約定的不同于文件終止條件下的取值的負(fù)整數(shù)值。只有在執(zhí)行序列輸入語(yǔ)句時(shí)才會(huì)出現(xiàn)文件終止條件,而只有在執(zhí)行非預(yù)輸入語(yǔ)句時(shí)才會(huì)出現(xiàn)紀(jì)錄終止條件,參見(jiàn)下面的例子?!纠?6-7】
READ(FMT="(E8.3)",UNIT=3,IOSTAT=IOSS)XIF(IOSS<0)THEN!對(duì)聯(lián)結(jié)到部件3的文件進(jìn)行文件終止操作.CALLEND_PROCESSINGELSEIF(IOSS>0)THEN!進(jìn)行出錯(cuò)處理CALLERROR_PROCESSINGENDIF5.出錯(cuò)分支處理如果在執(zhí)行一個(gè)包含了說(shuō)明符ERR=的輸入輸出語(yǔ)句時(shí)出現(xiàn)了錯(cuò)誤條件,就會(huì)導(dǎo)致如下的分支后果:●
輸入輸出語(yǔ)句執(zhí)行中斷;●
輸入輸出語(yǔ)句給出的文件定位不可確定;●
如果該輸入輸出語(yǔ)句還包含了IOSTAT=說(shuō)明符,那么其中給出的變量取值為系統(tǒng)約定的正整數(shù)值?!?/p>
如果執(zhí)行的語(yǔ)句是READ語(yǔ)句,并且包含了SIZE=說(shuō)明符,那么變量取值整數(shù)值;●
繼續(xù)執(zhí)行由ERR=說(shuō)明符給出的語(yǔ)句。6.文件終止時(shí)的分支處理如果在執(zhí)行包含了END=說(shuō)明符的輸入語(yǔ)句時(shí)出現(xiàn)了文件終止條件,但沒(méi)有出現(xiàn)錯(cuò)誤條件,那么會(huì)導(dǎo)致如下分支后果:●
輸入語(yǔ)句的執(zhí)行中斷;●
如果輸入語(yǔ)句中指定的文件是外部文件,那么它定位在文件終止紀(jì)錄的后面。●
如果輸入語(yǔ)句包含了說(shuō)明符IOSTAT=,那么其中給出的變量取值為系統(tǒng)約定的負(fù)整數(shù)值?!?/p>
繼續(xù)執(zhí)行由END=說(shuō)明符給出的語(yǔ)句。7.紀(jì)錄終止時(shí)的分支處理如果在執(zhí)行包含了EOR=說(shuō)明符的輸入輸出語(yǔ)句時(shí)出現(xiàn)了紀(jì)錄終止條件,但沒(méi)有出現(xiàn)錯(cuò)誤條件,那么會(huì)導(dǎo)致如下分支后果:●
如果語(yǔ)句當(dāng)中包含的說(shuō)明符PAD=的取值為YES,那么紀(jì)錄被添加上空格,以便滿足輸入列表項(xiàng)及其數(shù)據(jù)編輯描述符對(duì)于紀(jì)錄字符數(shù)目的要求?!?/p>
輸入語(yǔ)句的執(zhí)行中斷?!?/p>
輸入語(yǔ)句給出的文件定位于當(dāng)前紀(jì)錄后面?!?/p>
如果輸入語(yǔ)句包含了說(shuō)明符IOSTAT=,那么其中給出的變量取值為系統(tǒng)約定的負(fù)整數(shù)值?!?/p>
如果輸入語(yǔ)句包含了說(shuō)明符SIZE=,那么其中給出的變量取值為整數(shù)值?!?/p>
繼續(xù)執(zhí)行由EOR=說(shuō)明符給出的語(yǔ)句。8.ADVANCE=說(shuō)明符其中的標(biāo)量默認(rèn)字符表達(dá)式(scalar-default-char-expr)可以取值為YES或NO。該說(shuō)明符用來(lái)說(shuō)明是否在輸入輸出語(yǔ)句當(dāng)中出現(xiàn)非預(yù)輸入輸出。如果取值為NO,則出現(xiàn)非預(yù)輸入輸出;如果取值為YES,那么出現(xiàn)預(yù)格式化序列輸入輸出。如果該說(shuō)明符省略了,那么默認(rèn)取值為YES。9.字符數(shù)目說(shuō)明符SIZE=當(dāng)非預(yù)輸入語(yǔ)句中斷之后,在說(shuō)明符SIZE=當(dāng)中給出的變量,取值為在當(dāng)前輸入語(yǔ)句執(zhí)行過(guò)程當(dāng)中由數(shù)據(jù)編輯描述符傳輸?shù)淖址麛?shù)目。其中填充的空格不計(jì)入該字符數(shù)目值。16.3.2
數(shù)據(jù)傳輸?shù)妮斎胼敵隽斜硪粋€(gè)所謂輸入輸出列表給出通過(guò)數(shù)據(jù)傳輸輸入輸出語(yǔ)句傳輸了數(shù)據(jù)值的數(shù)據(jù)項(xiàng)。其中輸入項(xiàng)(input-item)的一般語(yǔ)法形式(R914)為:variableio-implied-do其中輸出項(xiàng)(output-item)的一般語(yǔ)法形式(R915)為:exprio-implied-do其中隱式輸入輸出do結(jié)構(gòu)(io-implied-do)的一般語(yǔ)法形式(R916)為:(io-implied-do-object-list,io-implied-do-control)而里面的隱式do對(duì)象(io-implied-do-object)的語(yǔ)法形式(R917)為:input-itemoutput-item里面的隱式輸入輸出do控制(io-implied-do-control)的語(yǔ)法形式(R918)為:do-variable=scalar-int-expr,&&scalar-int-expr[,scalar-int-expr]輸入輸出列表的一般規(guī)則為:●
作為輸入項(xiàng)的變量不能是完全啞尺度數(shù)組?!?/p>
do變量必須是整型的命名標(biāo)量變量。●
在輸入項(xiàng)列表(input-item-list)里面,隱式輸入輸出do對(duì)象(io-implied-do-object)●
必須是一個(gè)輸入項(xiàng)。●
在輸出項(xiàng)列表(output-item-list)里面,隱式輸入輸出do對(duì)象(io-implied-do-object)●
必須是一個(gè)輸出項(xiàng)?!?/p>
如果某個(gè)輸入項(xiàng)為指針,那么它必須當(dāng)前關(guān)聯(lián)于一個(gè)可定義的目標(biāo)數(shù)據(jù)對(duì)象,并且數(shù)據(jù)從文件傳輸?shù)疥P(guān)聯(lián)目標(biāo)。如果某個(gè)輸出項(xiàng)為指針,那么它必須當(dāng)前關(guān)聯(lián)于一個(gè)可定義的目標(biāo)數(shù)據(jù)對(duì)象,并且數(shù)據(jù)從關(guān)聯(lián)目標(biāo)傳輸?shù)轿募?。?/p>
一個(gè)輸入項(xiàng)不能是一個(gè)包含輸入項(xiàng)的隱式輸入輸出do結(jié)構(gòu)的do變量,也不能關(guān)聯(lián)于這樣的do變量。●
一個(gè)派生數(shù)據(jù)類型的對(duì)象,如果它的成員里面包含了指針,則不能作為輸入輸出列表里面的數(shù)據(jù)項(xiàng)。因?yàn)橹羔槼蓡T的值只是對(duì)于內(nèi)存地址的一個(gè)描述符,因此不具有獨(dú)立于系統(tǒng)的表示方法?!?/p>
如果輸入項(xiàng)或輸出項(xiàng)為可分配數(shù)組,那么它的當(dāng)前狀態(tài)應(yīng)該是已分配?!?/p>
包含在一個(gè)隱式輸入輸出do結(jié)構(gòu)里面的隱式輸入輸出do結(jié)構(gòu)的do變量,不能是其宿主結(jié)構(gòu)的do變量,也不能關(guān)聯(lián)于這樣的do變量?!?/p>
如果是輸入輸出列表里面出現(xiàn)了數(shù)組作為列表項(xiàng),那么其中的元素按照數(shù)組元素序的順序加以說(shuō)明。●
數(shù)組的元素都不影響輸入項(xiàng)里面任何表達(dá)式的值,任何元素都不能在輸入項(xiàng)里面重復(fù)出現(xiàn)?!?/p>
輸入輸出列表當(dāng)中的隱式do結(jié)構(gòu)的循環(huán)初始化和執(zhí)行過(guò)程與DO結(jié)構(gòu)的一樣。●
如果輸入輸出語(yǔ)句說(shuō)明的是內(nèi)部文件,那么輸入輸出列表不能包含非默認(rèn)字符類型的數(shù)據(jù)對(duì)象?!?/p>
常量,包含算符或函數(shù)引用的表達(dá)式,以及括號(hào)當(dāng)中的表達(dá)式都可以出現(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的元素都不重復(fù)則是合法的READ*,A(A(1):A(10))!非法【例16-9】WRITE(LP,FMT='(10F8.2)')(LOG(A(I)),I=1,N+9,K),G這個(gè)例子的輸出列表里面包含了一個(gè)隱式do結(jié)構(gòu)。16.3.3
數(shù)據(jù)傳輸輸入輸出語(yǔ)句的執(zhí)行執(zhí)行一個(gè)數(shù)據(jù)傳輸輸入輸出語(yǔ)句的完整過(guò)程如下:(1)決定數(shù)據(jù)傳輸?shù)姆较颍?2)確定相應(yīng)的部件;(3)如果要求格式則建立相應(yīng)的格式;(4)在文件傳輸之前對(duì)文件定位;(5)在文件與輸入輸出列表或名稱列表里面給出的數(shù)據(jù)項(xiàng)之間進(jìn)行數(shù)據(jù)傳輸;(6)隨時(shí)判別是否出現(xiàn)錯(cuò)誤條件,文件終止條件,以及紀(jì)錄終止條件;(7)在數(shù)據(jù)傳輸完成之后,再次對(duì)文件進(jìn)行定位;(8)對(duì)說(shuō)明符IOSTAT=和SIZE=里面的變量定義恰當(dāng)?shù)闹怠?6.3.4
格式化紀(jì)錄的打印把格式化之后的紀(jì)錄傳輸給系統(tǒng)設(shè)置的外部設(shè)備就稱為打印。在打印一個(gè)格式化紀(jì)錄的時(shí)候,紀(jì)錄的第一個(gè)字符是格式說(shuō)明,不被打印出來(lái),而紀(jì)錄的其他字符都打印在一行上。紀(jì)錄的第一個(gè)字符必須是默認(rèn)字符型數(shù)據(jù),它的功能在于決
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年辦公照明項(xiàng)目籌資方案
- 【電信終端產(chǎn)業(yè)協(xié)會(huì)】2024年終端智能化分級(jí)研究報(bào)告
- 國(guó)際物流題庫(kù)(含參考答案)
- 養(yǎng)老院老人生活?yuàn)蕵?lè)活動(dòng)組織人員行為規(guī)范制度
- 養(yǎng)老院老人健康檔案管理制度
- 《動(dòng)物簡(jiǎn)筆畫(huà)的步驟》課件
- 《電子技術(shù)基礎(chǔ)緒論》課件
- 2024年土地承包經(jīng)營(yíng)權(quán)流轉(zhuǎn)與農(nóng)業(yè)品牌建設(shè)合同范本3篇
- 提成協(xié)議書(shū)(2篇)
- 2024年版:高級(jí)管理職位聘任協(xié)議
- 音韻學(xué)入門(mén)智慧樹(shù)知到期末考試答案2024年
- 《煤礦重大事故隱患判定標(biāo)準(zhǔn)》解讀培訓(xùn)課件2024(中國(guó)煤礦安全技術(shù)培訓(xùn)中心)
- Q GDW 10115-2022 110kV~1000kV架空輸電線路施工及驗(yàn)收規(guī)范
- MOOC 家具·設(shè)計(jì)·生活-北京林業(yè)大學(xué) 中國(guó)大學(xué)慕課答案
- 大學(xué)生心理健康教育-第一章健康心理幸福人生
- 2023年考研政治真題(含答案及解析)
- 教育研究方法智慧樹(shù)知到期末考試答案2024年
- 農(nóng)村污水處理設(shè)施運(yùn)維方案特別維護(hù)應(yīng)急處理預(yù)案
- 會(huì)計(jì)學(xué)原理智慧樹(shù)知到期末考試答案2024年
- 學(xué)?;ㄌ幪庨L(zhǎng)述職報(bào)告
- 《血站業(yè)務(wù)場(chǎng)所建設(shè)指南 第3部分:獻(xiàn)血屋》
評(píng)論
0/150
提交評(píng)論