用fortran编写格式化的UTF-8文本文件
我正试图从fortran写一个文本文件 我编写了这个简短的测试程序,但它当然不起作用,因为它不会创建可读的文本文件:用fortran编写格式化的UTF-8文本文件,fortran,text-files,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
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
我读了很多不同的东西,但仍然不清楚应该怎么写
我需要在写之前转换成字符串吗?如果是,为什么 试试这个
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
。。。评论
PROGRAM test
IMPLICIT NONE
所有好的Fortran程序都包括行隐式none
;原因在101 Qs和这里的堆栈溢出中解释过,我在这里不再重复
INTEGER, PARAMETER :: ascii = selected_char_KIND ("ascii")
INTEGER, PARAMETER :: ucs4 = selected_char_KIND ('ISO_10646')
最新的Fortran标准要求编译器提供这两种类型的字符。老实说,我不确定iso_10646是否与UTF-8相同,但如果不是,你可能运气不好。这里,我定义了两个参数,用于识别稍后在程序中使用的字符类型。出于您的目的,这些参数中的第一个是不必要的,但您也应该了解它
我想您的编译器可能支持其他字符类型,请阅读文档
INTEGER :: ix
CHARACTER(len=5,kind=ucs4) :: greeting = ucs4_"hello"
(旁白:从技术上讲,还有第三个字符种类名称,default
。这可能会将字符种类设置为ascii
或iso10646
,最有可能是前者,但如果这对您很重要,请查看编译器文档。)
在第二行中,我用文本hello
定义了一个字符变量,属于ucs4
(如上所述,它是iso_10646
的本地代码)。如果没有前缀ucs4
,字符串hello
将被解释为default
类型,然后在存储到变量greeting
时转换为ucs4
。在这种情况下,如果ascii
和ucs4
中的字符(表示形式)之间存在1:1的映射,则前缀完全不需要,但在其他情况下则不需要
OPEN(10,FILE='test.txt')
DO ix=1,10
WRITE (10,'(A5,I4)') greeting, ix
END DO
CLOSE(10)
我已经删除了所有关于直接访问和写入文件中特定记录的废话。对于你眼前的需要来说,这些都是不必要的。因此,此循环将向文件test.txt
中写入greeting
(即ucs4字符串hello
)和行索引10次
END PROGRAM test
试试这个
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
。。。评论
PROGRAM test
IMPLICIT NONE
所有好的Fortran程序都包括行隐式none
;原因在101 Qs和这里的堆栈溢出中解释过,我在这里不再重复
INTEGER, PARAMETER :: ascii = selected_char_KIND ("ascii")
INTEGER, PARAMETER :: ucs4 = selected_char_KIND ('ISO_10646')
最新的Fortran标准要求编译器提供这两种类型的字符。老实说,我不确定iso_10646是否与UTF-8相同,但如果不是,你可能运气不好。这里,我定义了两个参数,用于识别稍后在程序中使用的字符类型。出于您的目的,这些参数中的第一个是不必要的,但您也应该了解它
我想您的编译器可能支持其他字符类型,请阅读文档
INTEGER :: ix
CHARACTER(len=5,kind=ucs4) :: greeting = ucs4_"hello"
(旁白:从技术上讲,还有第三个字符种类名称,default
。这可能会将字符种类设置为ascii
或iso10646
,最有可能是前者,但如果这对您很重要,请查看编译器文档。)
在第二行中,我用文本hello
定义了一个字符变量,属于ucs4
(如上所述,它是iso_10646
的本地代码)。如果没有前缀ucs4
则字符串hello
将被解释为属于类型default
,然后存储到变量greeting
时转换为ucs4
。在这种情况下,如果ascii
和ucs4
中的字符(表示形式)之间存在1:1的映射,则前缀完全不需要,但在其他情况下则不需要
OPEN(10,FILE='test.txt')
DO ix=1,10
WRITE (10,'(A5,I4)') greeting, ix
END DO
CLOSE(10)
我已经删除了所有关于直接访问和写入文件中特定记录的废话。对于你眼前的需要来说,这些都是不必要的。因此,此循环将向文件test.txt
中写入greeting
(即ucs4字符串hello
)和行索引10次
END PROGRAM test
在
open
语句中,您正在为未格式化的输入/输出打开一个文件。因为您已经指定了ACCESS=“direct”
默认设置为未格式化,而连接时默认设置为按顺序访问
要使文件“可读”,您需要主动打开以进行格式化访问,并提供写入格式:
open(1,FILE='teste.txt',ACCESS="direct",RECL=RECL1, FORM='formatted')
...
write(1,fmt=...,REC=REC2) ...
在
open
语句中,您正在为未格式化的输入/输出打开一个文件。因为您已经指定了ACCESS=“direct”
默认设置为未格式化,而连接时默认设置为按顺序访问
要使文件“可读”,您需要主动打开以进行格式化访问,并提供写入格式:
open(1,FILE='teste.txt',ACCESS="direct",RECL=RECL1, FORM='formatted')
...
write(1,fmt=...,REC=REC2) ...
你说“它不起作用”是什么意思?避免使用这个短语,因为它没有任何用处,也不会说明任何事情。具体点!是的,对不起,你说得对。我的意思是它创建了一个文件,但它并没有创建一个可读的文件,它的格式可以由gedit打开。你说“它不工作”是什么意思?避免使用这个短语,因为它没有任何用处,也不会说明任何事情。具体点!是的,对不起,你说得对。我的意思是它创建了一个文件,但它没有创建一个可读的文件,文件的格式可以由gedit打开。我理解得更好,非常感谢,但是,我仍然有以下错误消息:
GRAVARTXT.f90(8):error#6684:在这种上下文中,这是一个不正确的种类类型参数值。[UCS4]字符(len=5,kind=UCS4)::greeting=UCS4_u“hello”--------------------------^gravarText.f90(8):错误#6684:这是一个不正确的值