写入格式化的 UTF-8 文本文件 fortran

Dad*_*dep 0 fortran text-files

我正在尝试从 fortran 写入文本文件。

我做了这个简短的测试程序,但当然它不起作用,因为它不会创建一个可读的文本文件:

PROGRAM teste

 INTEGER(4) REC2,RECL1
 character(20) :: charI, wanted
 RECL1=10
 DO REC2=1,10
  OPEN(1,FILE='teste.txt',ACCESS="direct",RECL=RECL1);
  write (charI, "(A5,I4)") "hello", REC2
  wanted=trim(charI)
  write(1,REC=REC2) wanted
  close(1)
 END DO


END PROGRAM teste
Run Code Online (Sandbox Code Playgroud)

我读了很多不同的东西,但仍然不清楚应该如何写。

在写之前我需要转换为字符串吗?如果是为什么?

Hig*_*ark 5

尝试这个

PROGRAM test

  IMPLICIT NONE

  INTEGER, PARAMETER :: ascii = selected_char_KIND ("ascii")
  INTEGER, PARAMETER :: ucs4  = selected_char_KIND ('ISO_10646')   
  INTEGER :: ix
  CHARACTER(len=5,kind=ucs4) :: greeting = ucs4_"hello"

  OPEN(10,FILE='test.txt')    
  DO ix=1,10
     WRITE (10,'(A5,I4)') greeting, ix
  END DO
  CLOSE(10)

END PROGRAM test
Run Code Online (Sandbox Code Playgroud)

……评论……

PROGRAM test

  IMPLICIT NONE
Run Code Online (Sandbox Code Playgroud)

所有好的 Fortran 程序都包含这行implicit none;原因在 101 Qs 和 As here on Stack Overflow 中有解释,我不会在这里重复。

  INTEGER, PARAMETER :: ascii = selected_char_KIND ("ascii")
  INTEGER, PARAMETER :: ucs4  = selected_char_KIND ('ISO_10646')  
Run Code Online (Sandbox Code Playgroud)

最新的 Fortran 标准要求编译器提供这两个kind字符。老实说,我不确定是否iso_10646与 UTF-8 相同,但如果不是,您可能不走运。在这里,我定义了两个参数,用于标识稍后在程序中使用的字符类型。出于您的目的,这些参数中的第一个是不必要的,但您也应该了解它。

我想您的编译器可能支持其他字符类型,请阅读文档。

(另外:从技术上讲,还有第三个字符种类名称,default。这可能会将字符种类设置为asciiiso_10646,最有可能是前者,但如果这对您很重要,请检查编译器的文档。)

  INTEGER :: ix
  CHARACTER(len=5,kind=ucs4) :: greeting = ucs4_"hello"
Run Code Online (Sandbox Code Playgroud)

在这些行的第二行中,我定义了一个带有文本hello和种类的字符变量ucs4(正如您在上面看到的,它是 的本地代码iso_10646)。如果没有前缀ucs4_,字符串hello将被解释为类型default,然后ucs4在存储到变量中时转换为greeting。在这种情况下,前缀中asciiucs4前缀中的字符(表示)之间存在 1:1 映射是完全没有必要的,但在其他情况下则不会。

  OPEN(10,FILE='test.txt')    
  DO ix=1,10
     WRITE (10,'(A5,I4)') greeting, ix
  END DO
  CLOSE(10)
Run Code Online (Sandbox Code Playgroud)

我已经删除了关于直接访问和写入文件中特定记录的所有废话。对于您的迫切需要,这一切都是不必要的。所以这个循环会将greeting(即 ucs4 字符串hello)和一个行索引写入文件test.txt10 次。

END PROGRAM test
Run Code Online (Sandbox Code Playgroud)

  • @Dadep,这可能只是意味着您的编译器不支持这种字符。如果你 `print*, selected_char_kind('ISO_10646');end ` 你可能会看到值 `-1`。 (2认同)