Fortran Coder

查看: 12877|回复: 9
打印 上一主题 下一主题

[文件读写] 如何在文件开始(或文件中间)插入一条记录

[复制链接]

10

帖子

2

主题

0

精华

入门

F 币
61 元
贡献
35 点
跳转到指定楼层
楼主
发表于 2017-7-28 18:21:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一直没解决这个问题:打开一个顺序文件进行写入,写完后,想在文件最前面插入一条记录,用rewind命令回到开头,写入记录后,前面写入的其他内容就都没有了。
不知有没有人解决过此类问题(注:重点是插入,而不是先存入变量中,最后再一起写如)。

下面是统计文件行数并写在文件开头的列子,结果rewind后只有行数,无其他内容。
[Fortran] 纯文本查看 复制代码
       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)

      
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2015

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1572 元
贡献
676 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2017-7-28 18:52:55 | 只看该作者
所有windows应用程序,想在文件里插入内容,都是全部读入内存,然后重新重头写入的。

所以你会发现用记事本,word,UE打开保存一个文件很慢。
(我不是很清楚linux和MacOS的情况,但是fortran语法里无法实现直接的文件插入)

834

帖子

2

主题

0

精华

大宗师

F 币
3922 元
贡献
2332 点
板凳
发表于 2017-7-30 08:51:36 | 只看该作者
本帖最后由 li913 于 2017-7-30 08:54 编辑

在文件第一行预留足够空间,比如第一行输出10个任意字符。整体输出完毕后,用流文件打开,替换先前字符。
[Fortran] 纯文本查看 复制代码
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

评分

参与人数 1F 币 +4 贡献 +4 收起 理由
fcode + 4 + 4 不错的思路

查看全部评分

10

帖子

2

主题

0

精华

入门

F 币
61 元
贡献
35 点
地板
 楼主| 发表于 2017-7-31 11:18:03 | 只看该作者
谢谢大家!看来没啥好办法,要么先保存在内存里,要么重新读写一遍。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

5#
发表于 2017-7-31 12:10:18 | 只看该作者
lz为啥不考虑二进制文件格式呢?譬如MAT、HDF5等等

10

帖子

2

主题

0

精华

入门

F 币
61 元
贡献
35 点
6#
 楼主| 发表于 2017-7-31 14:56:35 | 只看该作者
li913 发表于 2017-7-30 08:51
在文件第一行预留足够空间,比如第一行输出10个任意字符。整体输出完毕后,用流文件打开,替换先前字符。[m ...

此办法可以,不要重读一遍,只要重新打开写入。

10

帖子

2

主题

0

精华

入门

F 币
61 元
贡献
35 点
7#
 楼主| 发表于 2017-7-31 15:11:03 | 只看该作者
li913 发表于 2017-7-30 08:51
在文件第一行预留足够空间,比如第一行输出10个任意字符。整体输出完毕后,用流文件打开,替换先前字符。[m ...

谢谢大家,此方法可以,不需重新读写一遍,只需重新打开写入即可。但不明白其原理,难道以”stream“方式打开文件时会整个都读入内存?关闭时再次写入?流文件是新加入的形式,下去好好看看。

10

帖子

2

主题

0

精华

入门

F 币
61 元
贡献
35 点
8#
 楼主| 发表于 2017-7-31 17:21:19 | 只看该作者
pasuka 发表于 2017-7-31 12:10
lz为啥不考虑二进制文件格式呢?譬如MAT、HDF5等等

因为文件不大,比较简单,不太会其他复杂格式,只会Fortran。

834

帖子

2

主题

0

精华

大宗师

F 币
3922 元
贡献
2332 点
9#
发表于 2017-8-2 15:23:32 | 只看该作者
redasia 发表于 2017-7-31 15:11
谢谢大家,此方法可以,不需重新读写一遍,只需重新打开写入即可。但不明白其原理,难道以”stream“方式 ...

二进制文件写入,只更改相应的字符,文件其余内容不变。

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

10#
发表于 2017-8-8 13:29:04 | 只看该作者
意猶未盡: https://stackoverflow.com/questi ... -file-using-fortran
SEQUENTIAL access: 吐槽不便(基本上只能topdown), 無感優點(vary length)
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-1 12:25

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表