【问题标题】:Open statement in fortran在 fortran 中打开语句
【发布时间】:2015-06-25 17:34:31
【问题描述】:

我对 fortran 的开放命令有疑问。

OPEN (UNIT = , FILE=file-name, ACCESS=access, FORM=form, RECL=recl)`
Access = sequential, direct
FORM=formatted, unformatted 

recl 是文件的记录长度(以字节为单位)

我尝试了很多搜索,但无法理解顺序访问或直接访问、格式化或未格式化文件、文件记录长度的含义。谁能解释一下这些术语是什么意思?

【问题讨论】:

    标签: fortran gfortran


    【解决方案1】:

    文件访问指定打开文件后如何写入(或读取)文件。以一种访问模式打开,但与另一种访问模式读/写一致,通常会导致运行时错误。

    顺序访问很自然地意味着顺序读取和写入。顺序写入意味着输出以与程序生成它的顺序相同的顺序放置在输出文件中,因此,如果 X 在 Y 之前输出,则文件将在 Y 之前(更接近文件的开头)包含 X。顺序读取表示从文件开始到结束进行读取。追加访问是一种特殊形式的顺序访问,它从文件末尾开始(所以写操作添加到文件末尾)。

    直接访问意味着可以按任何顺序访问文件的内容。这也称为随机访问。本质上,当执行输入或输出时,程序必须在文件中指定操作发生的位置。

    在 Fortran 中直接访问文件中的位置以“记录”的形式指定,它们都具有完全相同的长度(由打开文件时的 RECL= 子句指定)。因此,如果一个文件包含 20 条记录,并且记录长度等于 30,则程序可以从文件中访问的数据总大小为 600 字节,每次读取或写入操作都会访问一条包含 30 字节的记录。

    未格式化的文件基本上意味着文件的内容作为流进行读写。未格式化的顺序访问文件相当于从头到尾读取的 C 等语言中的二进制文件。未格式化的直接访问文件也是二进制的,但操作可以按任意顺序访问文件(在程序的控制下)。

    格式化文件本质上意味着所有读写都必须涉及格式规范。还有一些特殊处理,例如在写入时,在每个写入语句的末尾都会将换行符写入文件。

    纯文本文件通常以顺序访问格式文件的形式打开。每个 Fortran 读取或写入操作都作用于一个新行(因此两个写入语句将在文件中产生两行,并且需要两个相应的读取语句将它们读回)。

    可以有一个格式化的直接访问文件。这基本上意味着读取和写入语句必须指定格式来读取/写入记录,但是可以以任何顺序访问记录。记录的结尾通常用换行符标记。

    【讨论】:

    • 感谢您的详细解答! 在 Fortran 中直接访问文件中的位置以“记录”的形式指定,它们都具有完全相同的长度(由打开文件时的 RECL= 子句指定) 该位置是否为一行, 哪个字符数相同?我不太明白。 未格式化的文件基本上意味着文件的内容以流的形式读取和写入。 您能否解释一下“流”是什么意思或指导我找到适当的参考资料?谢谢。
    • 如果记录长度为30字节,则第一条记录占用文件的前30字节,第二条记录占用后30字节,以此类推。记录不是行 - 它们只是字节集(除了在格式化的直接访问文件中,记录的结尾由换行符标记,因此记录在概念上可能是一行)。计算机科学中的流是有序序列。将文件描述为流意味着如果程序 A 将一组数据写入文件,而程序 B 随后读取该文件,则程序 B 将按照程序 A 写入数据的顺序读取数据。
    【解决方案2】:

    在网上很容易找到(包括这里的讨论):

    “记录”是数据,通常以字符为单位。有些文件的记录长度相同,有些则没有。在这两者之间,有一些文件将每个记录的长度存储为记录的一部分。使用具有相同长度的记录的文件是最简单的,因为(对于许多存储设备)您可以通过知道记录号和记录的长度来计算特定记录的开头。如果记录的长度不同,则跟踪记录位置的工作量更大。

    顺序文件一次访问一条记录,就像磁带一样(有关长度讨论,请参阅this page)。通常,磁带可以倒带、向前读取,但在随机点读取更难。这样做是直接访问。 This page 明确表明两者之间有不同的选择 - 您可以选择其中一个。

    格式化输出就是这样 - 使输出遵循某种报告风格的格式(在行级别上),而未格式化的输出不遵循整洁的规则。有关讨论的示例,请参见 Fortran unformatted file format。从技术角度讲,Oracle 的this page 更深入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 2017-01-18
      • 1970-01-01
      • 2020-10-08
      相关资源
      最近更新 更多