如何在fortran中的特定行写入
Posted
技术标签:
【中文标题】如何在fortran中的特定行写入【英文标题】:How to write at specific lines in fortran 【发布时间】:2015-06-23 15:51:27 【问题描述】:我想从文件夹中复制一个文件并使用 fortran 在文件的特定行写入。我正在使用 Windows,GNU fortran 编译器。这是示例文件和代码。
file1.txt
1 *
2 **
3 ***
4 ****
5 *****
6 ******
7 *******
8 ********
9 *********
10 **********
代码如下:
我定义了一些变量。只有当两个条件匹配(特定变量值和行号)时,我才想在文件中写入新文本。我尝试使用system
命令进行复制,但失败了。谁能告诉我正确的使用方法?程序出现运行时错误FORMAT present for unformatted text
program read
integer :: a,b,c,d,e
CHARACTER (LEN=200) :: str
a=0
b=1
c=0
d=1
e=0
!call system ("copy" // "D:\test1\file1.txt"," ", // "D:")
!This command fails
open (unit=10, file="file1.txt", access="direct", &
form="unformatted", action="readwrite", recl=100 )
do i=1,10,1
read (10,*) str
if(a==0 .AND. i==3) then
write(10,100) 'This is ',i,' line'
else if(b==0 .AND. i==4) then
write(10,100) 'This is ',i,' line'
else if(c==0 .AND. i==5) then
write(10,100) 'This is ',i,' line'
else if(d==0 .AND. i==6) then
write(10,100) 'This is ',i,' line'
else if(e==0 .AND. i==7) then
write(10,100) 'This is ',i,' line'
100 format (2a,i0,1X)
end if
end do
close (unit=10)
end program
我可以在同一个文件中读写吗?请分享你的cmets。我提到了一些问题Fortran - How to write data to specific line in the file?,但无法帮助我。
【问题讨论】:
首先将您的“未格式化”更改为“格式化”。未格式化意味着二进制,格式化是文本(或多或少)。但请注意,直接访问文件要求所有行的长度相同。你是怎么用system
怎么失败的?
“就地”更新文件是可能的,但可能会很棘手。读取文件并将行写入新文件通常要简单得多,随时替换您要替换的那些。后一种方法将避免直接访问中的错误会给您留下第一次操作文件时的混乱。你觉得幸运吗?
@HighPerformanceMark 你能告诉我一种逐行复制文件的方法吗?
【参考方案1】:
您的系统调用存在一些问题。首先,copy
和第一个参数之间需要一个空格。其次,您需要一个目标文件,而不仅仅是一个文件夹。此外,您应该只使用字符串连接器//
,而不是逗号。例如,如果你想复制到一个新的文件名file2.txt
,你可以使用这样的系统调用:
call system ("copy " // "D:\test1\file1.txt " // "D:\test1\file2.txt")
因为您使用的是文字字符串而不是变量,所以您可以通过去掉连接符来简化它:
call system ("copy D:\test1\file1.txt D:\test1\file2.txt")
【讨论】:
【参考方案2】:为了说明,这里是如何使用文本文件直接访问工作:
implicit none
character*8 x
! create a test file, all lines 8 characters:
open(20,file='test.txt')
x='12345678'
write(20,'(a)')x
x='asdfghjk'
write(20,'(a)')x
x='qwertyui'
write(20,'(a)')x
close(20)
! open file direct access, note record length is 8+2 because I'm
! stuck on DOS today with cr/lf line ends
open(20,file='test.txt',access='direct',recl=10,form='formatted')
! read whatever we want
read(20,'(a)',rec=3)x
write(*,*)'line 3 is',x
! overwrite a particular line -- note the format is exactly 10 char
! including the manually added line ending
write(20,'(f5.2,i3,2a)',rec=2)3.14,42,char(13),char(10)
end
结果文件:
12345678 3.14 42 奎尔蒂伊
【讨论】:
澄清一下:在 *nix 上运行所需的唯一修改是将recl
从 10
更改为 9
,并去掉回车符 char(13)
。跨度>
感谢您的回复。但是,如问题中所述,我的文件的长度不是恒定的。那么,我不能在“在线”文件中进行更改吗?我不明白为什么我们不能对具有不同行长的文件进行更改。编译器或操作系统有什么限制吗?
原则上您可以使用recl=1
打开,读取和写入单个字符,但实际上标准方法是读取整个文件并使用所需的更改重写整个文件。顺便说一句,这不是 fortran 限制,无论语言如何,都是相同的问题。以上是关于如何在fortran中的特定行写入的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Fortran 派生类型或类中实现类型绑定写入语句输出