【问题标题】:What do .txt files have to look like so that data can be read out of it?.txt 文件必须是什么样子才能从中读取数据?
【发布时间】:2016-10-29 17:28:52
【问题描述】:

我创建了一个如下所示的 .txt 文件

4 4 4 !DIM_M, DIM_L, DIM_N
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2 20  !DIM_START, DIM_END

但关键是,如果我现在添加一些 cmets,例如我使用的矩阵名称,那么我会得到一些错误,即

4 4 4 !DIM_M, DIM_L, DIM_N
1 2 3 4 !A
5 6 7 8
9 10 11 12
13 14 15 16
1 2 3 4 !B
5 6 7 8
9 10 11 12
13 14 15 16
2 20  !DIM_START, DIM_END

它不再起作用了。我用来读取 .txt 文件的 Fortran 文件是

    ! OPEN FILE
    OPEN(UNIT=39, STATUS='OLD', ACTION='READ',FILE='input.txt',IOSTAT=IERROR)
    !READ DIMENSIONS + CHECK IF SUCCESFUL
    READ(39,*,IOSTAT=IERROR)DIM_M, DIM_L, DIM_N
    ALLOCATE(A(DIM_M,DIM_L),B(DIM_L,DIM_N), C(DIM_M,DIM_N), STAT=IERROR)
    READ (39,*, IOSTAT=IERROR)A
    READ (39,*, IOSTAT=IERROR)B
    READ (39,*) DIM_START, DIM_END
    CLOSE(UNIT=39)

我忽略了检查文件读取是否有效的所有部分(使用 IOSTAT)。有什么想法可以改变这个吗?

【问题讨论】:

  • 你说的“一些错误”是什么意思,你真的应该列出具体的错误,我们无法读取你的屏幕。
  • 对所有 Fortran 问题使用标签 fortran
  • 真的需要那些cmets吗?如您所见,注释处理会增加原本干净简单的代码的复杂性。

标签: io fortran


【解决方案1】:

将其作为字符串读入,然后只使用字符串中直到“!”的部分用于读取变量。

既然你提供了一个非编译的例子,我会实物回复。

! OPEN FILE
CHARACTER(LEN=132) :: ALine
CHARACTER(LEN=1), PARAMETER :: Bang '!'
OPEN(UNIT=39, STATUS='OLD', ACTION='READ',FILE='input.txt',IOSTAT=IERROR)
!READ DIMENSIONS + CHECK IF SUCCESsFUL
READ(39,*,IOSTAT=IERROR) ALine
IF(INDEX(ALine,bang) > 0) THEN
  READ(ALine(1:INDEX(ALine,'!')-1) ,*,IOSTAT=IERROR) DIM_M, DIM_L, DIM_N
ELSE
  READ(ALine ,*,IOSTAT=IERROR) DIM_M, DIM_L, DIM_N
ENDIF
ALLOCATE(A(DIM_M,DIM_L),B(DIM_L,DIM_N), C(DIM_M,DIM_N), STAT=IERROR)
!Etc

【讨论】:

  • 列表定向格式不能用于读取普通文本行。
  • 我必须检查一下,因为我在工作中经常这样做。我通常从搜索逗号和引号开始,然后将字符串分成小块,所以你可能是对的。我把它都放在图书馆里,因为我需要一年做几次。
【解决方案2】:

如果在一行上总是有 DIM_M 和 DIM_L 数字,则循环读取它们

do l = 1, dim_l
  read(39,*,iostat=ierror) A(:,l)
  if (ierror /= 0) do something
end do

do n = 1, dim_n
  read(39,*,iostat=ierror) A(:,n)
  if (ierror /= 0) do something
end do

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2014-07-13
    • 2017-08-13
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多