如何在文件开始(或文件中间)插入一条记录
一直没解决这个问题:打开一个顺序文件进行写入,写完后,想在文件最前面插入一条记录,用rewind命令回到开头,写入记录后,前面写入的其他内容就都没有了。不知有没有人解决过此类问题(注:重点是插入,而不是先存入变量中,最后再一起写如)。
下面是统计文件行数并写在文件开头的列子,结果rewind后只有行数,无其他内容。
open(40,file='out.txt',form="formatted")
open(12, file="in.txt")
line_num=0
do !顺序读取
read(12,*iostat=ioerr) t
if(ioerr/=0)exit
write(40,'(f10.2)')t
line_num=line_num+1
enddo
rewind(40)
write(40,'(i10)')line_num
close(40)
close(12)
所有windows应用程序,想在文件里插入内容,都是全部读入内存,然后重新重头写入的。
所以你会发现用记事本,word,UE打开保存一个文件很慢。
(我不是很清楚linux和MacOS的情况,但是fortran语法里无法实现直接的文件插入)
本帖最后由 li913 于 2017-7-30 08:54 编辑
在文件第一行预留足够空间,比如第一行输出10个任意字符。整体输出完毕后,用流文件打开,替换先前字符。program test
character(10)::ch=''
open(40,file='out.txt',form="formatted")
open(12, file="in.txt")
write(40,*) ch
line_num=0
do !顺序读取
read(12,*,iostat=ioerr) t
if(ioerr/=0)exit
write(40,'(f10.2)')t
line_num=line_num+1
enddo
close(40); close(12)
open(40,file='out.txt',status='old',access='stream')
write(ch,'(i10)')line_num
write(40) ch
close(40)
end program 谢谢大家!看来没啥好办法,要么先保存在内存里,要么重新读写一遍。 lz为啥不考虑二进制文件格式呢?譬如MAT、HDF5等等 li913 发表于 2017-7-30 08:51
在文件第一行预留足够空间,比如第一行输出10个任意字符。整体输出完毕后,用流文件打开,替换先前字符。
此办法可以,不要重读一遍,只要重新打开写入。 li913 发表于 2017-7-30 08:51
在文件第一行预留足够空间,比如第一行输出10个任意字符。整体输出完毕后,用流文件打开,替换先前字符。
谢谢大家,此方法可以,不需重新读写一遍,只需重新打开写入即可。但不明白其原理,难道以”stream“方式打开文件时会整个都读入内存?关闭时再次写入?流文件是新加入的形式,下去好好看看。 pasuka 发表于 2017-7-31 12:10
lz为啥不考虑二进制文件格式呢?譬如MAT、HDF5等等
因为文件不大,比较简单,不太会其他复杂格式,只会Fortran。 redasia 发表于 2017-7-31 15:11
谢谢大家,此方法可以,不需重新读写一遍,只需重新打开写入即可。但不明白其原理,难道以”stream“方式 ...
二进制文件写入,只更改相应的字符,文件其余内容不变。 意猶未盡: https://stackoverflow.com/questions/38176611/overwrite-a-file-using-fortran
SEQUENTIAL access: 吐槽不便(基本上只能topdown), 無感優點(vary length)
页:
[1]