【问题标题】:How do I edit the existing file in fortran and export it to the same file如何在 fortran 中编辑现有文件并将其导出到同一文件
【发布时间】:2022-02-09 01:40:50
【问题描述】:

我正在尝试在我的输入文件中交换一些字符。 如果我将数据导出到新文件,我的代码可以正常工作。 但是,我无法将更改导出到同一个文件。在前 2 行之后,它没有正确导出数据。你对我有什么建议吗?

这是我需要更改的数据(我需要删除 % 符号)

test.su2:

%file
%
%
%
4 4 
4 5
3 5
%
%
3 4
4 2

这是我的代码,它忽略了以 % 开头的行并将其写入另一个 .su2 文件:

程序更新_su2_file

  IMPLICIT NONE
  INTEGER :: I
  CHARACTER(80) :: LINE


  OPEN(10,FILE='2DCRM.su2',FORM='FORMATTED')
  OPEN(20,FILE='2DCRM_updated.su2',FORM='FORMATTED')



  DO 100 WHILE (.TRUE.)
  READ (10,'(A)',END=999) LINE  !Read line from input file

  IF(LINE(1:1).EQ.'%') GOTO 100 !Skip line starts with %
  WRITE(20,'(A)') TRIM(LINE)    !Write line to output file   100 END DO   999 CONTINUE 

  CLOSE (10)
  CLOSE (20)

  END PROGRAM update_su2_file

基本上我需要将更新后的数据写入 test.su2 文件而不是新文件。

我尝试如下更新我的代码,但正如我上面提到的,它没有正确写入我的数据。

程序更新_su2_file

  IMPLICIT NONE
  INTEGER :: I
  CHARACTER(80) :: LINE


  OPEN(10,FILE='test.su2',FORM='FORMATTED')



  DO 100 WHILE (.TRUE.)
  READ (10,'(A)',END=999) LINE  !Read line from input file

  IF(LINE(1:1).EQ.'%') GOTO 100 !Skip line starts with %
  WRITE(10,'(A)') TRIM(LINE)    !Write line to output file   100 END DO   999 CONTINUE 

  CLOSE (10)

  END PROGRAM update_su2_file

这是不正确的输出文件:

%file
%file

【问题讨论】:

  • 老实说,只需将新文件复制到旧文件上即可。您可以从 Fortran 调用 mvcp
  • 如果我的问题不清楚,我很抱歉。我需要删除“%”字符而不创建新文件。因为输入文件的大小可能很大并且需要时间。 @弗拉基米尔F
  • 无论如何,这是你应该做的事情。只写一个新文件。或者在文本编辑器中进行,并希望它有一些巧妙的算法来避免新文件(恕我直言,不太可能,但我知道的很少)。
  • 如果您担心创建文件需要多长时间,或者第二个临时文件有多大,您可能会找到一种方法来忽略那些“注释行”加工。例如,如果您正在读入一个数组并想使用read(10,*) big_array,则根据追加新行进行重写。
  • 即使像sed -i '/^%/d' test.su2 这样的就地操作也可以通过创建一个临时工作文件来工作。

标签: fortran write


【解决方案1】:

就地编辑文件是解决问题的错误方法。您应该将所需的输出写入第二个文件,如果需要,用第二个文件替换原始文件。

我将解释为什么这不是你应该做的,而不是展示如何编辑文件。

已连接的外部文件只有一个位置。 对于此任务,您需要维护两个位置:您将要写入的位置,以及到目前为止您已完成的读取进度。您可以这样做,但您必须手动跟踪和重新定位。

您的文件有不同长度的记录。 如果您想将第一条内容为%file 的记录替换为内容为4 4 的记录,或者将内容% 替换为2 4您需要在文件中移动以下任何其他内容的位置。这将使创建第二个文件的任何文件系统访问成本相形见绌。

即使只有这两个问题,它已经成为一项艰巨的任务。一个你会弄错的,丢弃你唯一的文件副本。写入第二个文件要容易得多。


您还必须考虑可重复性和可用性。对于此任务,您的程序是幂等的(因此,如果您在新文件上再次运行该程序并不重要),但并非所有类似的程序都是。

就像在测试危险的覆盖程序时一样,您希望将来可以使用原件:明天,您的主管说“我想要您获得的输入数据,以便与我的其他学生分享”,或者期刊审稿人问“原始来源是什么样的?”。您希望将原始研究工件安全地存放起来,因此“就地”毫无意义。

【讨论】:

  • 不编写程序来编辑文件的另一个令人信服的原因是,第一次运行这样的程序时,它会破坏文件的唯一副本。一个人永远不会第一次得到这些程序!没有文件大到不应该有它的备份副本;如果它对于一个人的磁盘来说太大了,请将其备份到磁带上。
  • 感谢您的详细回答@francescalus。让我们假设我继续处理两个文件(一个是原始文件,另一个是编辑文件)请问我如何用 fortran 中的原始文件替换第二个文件?这是一个自动化过程,因此最好在文件末尾执行此步骤。
  • 您可以简单地(不可移植地)要求您的操作系统重命名文件(可能以像here 这样的抽象方式)。但也许你不需要重命名,而是引用你刚刚创建的文件的单位而不是原来的?
猜你喜欢
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多