【发布时间】:2015-01-20 16:54:38
【问题描述】:
我正在用 Fortran 编写代码,我希望它以这种方式从文件中读取输入值
READ(5,*)IDIAM,ISET
我想将它们写入一个打开的文件。我写了这段代码
WRITE(36,*)'IDIAM',IDIAM,'ISET',ISET
这可行,但它将所有内容写在一行上。我希望每个输出行只有一个字符串和一个变量,而不需要在代码中重复写入行(因为我有很多变量)。我该怎么做?
【问题讨论】:
我正在用 Fortran 编写代码,我希望它以这种方式从文件中读取输入值
READ(5,*)IDIAM,ISET
我想将它们写入一个打开的文件。我写了这段代码
WRITE(36,*)'IDIAM',IDIAM,'ISET',ISET
这可行,但它将所有内容写在一行上。我希望每个输出行只有一个字符串和一个变量,而不需要在代码中重复写入行(因为我有很多变量)。我该怎么做?
【问题讨论】:
粗略地说,如果您使用列表导向输出(这是 write 语句中 * 的效果),那么编译器在输出外观(“may”和“合理”是其规范中使用的术语)。这与这里的冲突:需要一些特定的控制。
具体控制是何时开始新记录。
通常,一条记录对应一整行。这意味着您希望将每个字符串/值对写入单个记录。为每一对设置一个 write 语句可以管理这一点,但这正是您不想要的。
要使用单个write 语句,答案是使用显式格式。类似的东西
write(36,'(A,1X,I0)') 'IDIAM',IDIAM,'ISET',ISET
这样当一对被写入时,记录就结束了。
为了简单起见,我从变量名中假设变量是整数。如果不是,则考虑使用通用编辑(使用G)。还有斜杠编辑描述符 (/),它强制创建一个新记录,这在有模式时很有用:请注意,格式 '(A,1X,I0,/,A,1X,I0)' 在特定情况下与上面的效果相同,即有两对要写入.
在 IanH 更正上面的“/”格式后,系统提示我提及冒号编辑和重复说明符。如前所述,声明
write(36, '(A,1X,I0,/)') 'IDIAM',IDIAM,'ISET',ISET, ...
终止格式转换的记录(当达到) 时)。这可能会导致每对之间出现空行:一个用于/,一个用于格式结束。因此,使用/ 与第一种格式更接近的匹配是
write(36, '(*(A,1X,I0,:,/))') 'IDIAM',IDIAM,'ISET',ISET, ...
与原版相比,这是相当愚蠢的,但这种方法的威力希望是显而易见的。
有关一般显式格式的详细信息,请参阅文档。
【讨论】:
write(...) 'IDIAM', REAL(IDIAM)(等等,即返回一个真实的表示)使用适当的真实类型编辑描述符(F,E, ...)。但是,列表导向输入不需要一致的格式,并且您的列表导向输出对于每种类型都有不同的格式。因此,我建议使用G edit,它还将处理诸如逻辑类型将清理代码之类的事情。 [这就是广义编辑的重点。]