Fortran Coder

查看: 17537|回复: 8
打印 上一主题 下一主题

[文件读写] 将一个文件中的前几行内容放在另一个文件的前几行

[复制链接]

40

帖子

11

主题

0

精华

大宗师

F 币
4252 元
贡献
1857 点

规矩勋章

QQ
跳转到指定楼层
楼主
发表于 2016-10-13 15:54:49 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 978142355 于 2016-10-13 15:56 编辑

如题,打算把aa.cube文件的前10行放在pot.cub文件的最开头,自己写了程序,如下。由于两个文件都比较大(单个210M,仅仅上传了删改后的数据),发现需要5分钟才能转化完成,还不如手动直接复制粘贴……………………所以开贴求助大家,如何既能实现如题的功能,时间消耗的还比较少。
[Fortran] 纯文本查看 复制代码
    program pot_head
    implicit none
    integer i,j,ierr
    character(len=84) str

    open(11,file='aa.cube') 
    open(12,file='temp1')
    open(13,file='pot.cub')
    open(14,file='temp2')
    i=0
    do
        read(11,"(a84)",iostat=ierr) str
        if(str(9:10)=='E') exit
        if(ierr/=0) exit
        i=i+1
    end do
    rewind(11)
    do j=1,i
        read(11,"(a84)") str
        write(12,"(a84)") str
    end do
    close(11)
    rewind(12)
    do j=1,i
        read(12,"(a84)") str
        write(14,"(a84)") str
    end do
    do
        read(13,"(a84)",iostat=ierr) str
        if (ierr/=0) exit
        write(14,"(a84)") str
    end do
    close(12,status='delete')
    close(13,status='delete')
    rewind(14)
    open(15,file='pot.cub')
    do
        read(14,"(a84)",iostat=ierr) str
        if(ierr/=0) exit
        write(15,"(a84)") str
    end do
    close(14,status='delete')
    close(15)
    read(*,*)
    end program pot_head


input.rar

9.75 KB, 下载次数: 14

输入文件,解压后出现aa.cube和pot.cub

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
where is dream,where is home

40

帖子

11

主题

0

精华

大宗师

F 币
4252 元
贡献
1857 点

规矩勋章

QQ
9#
 楼主| 发表于 2016-10-15 19:46:10 | 只看该作者
vvt 发表于 2016-10-15 11:28
head -10 aa.cube > pot_new.cub
cat pot.cub >> pot_new.cub

谢谢vvt。Linux命令,这个速度非常快,几乎是一瞬间完成,看来得加入脚本,谢谢O(∩_∩)O~,这个帖子学到了好多东西,非常感谢。
where is dream,where is home

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
8#
发表于 2016-10-15 11:28:40 | 只看该作者
head -10 aa.cube > pot_new.cub
cat pot.cub >> pot_new.cub

40

帖子

11

主题

0

精华

大宗师

F 币
4252 元
贡献
1857 点

规矩勋章

QQ
7#
 楼主| 发表于 2016-10-15 09:41:01 | 只看该作者
pasuka 发表于 2016-10-14 09:17
过奖了
换成copy命令合并两个文件,也许能进一步提高效率譬如

太感谢您了,您的这个方法非常不错,这个是在windows下可以,Linux系统下不知道可不可以?再次感谢您又提供了一个新的方法O(∩_∩)O~
where is dream,where is home

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

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

6#
发表于 2016-10-14 09:17:18 | 只看该作者
本帖最后由 pasuka 于 2016-10-14 09:18 编辑
978142355 发表于 2016-10-14 08:25
嗯,谢谢pasuka老师,这种方法很简洁,也很简单,速度的话,和上面Li老师的差不多,谢谢你的建议,让我又 ...

过奖了
换成copy命令合并两个文件,也许能进一步提高效率譬如
3.将文件1.txt和2.txt合并为3.txt

copy /b c:\1.txt+2.txt c:\3.txt

命令格式:copy /b 文件1+文件2+......文件N 合并后的文件名
命令讲解:使用"+"将多个相同或不同格式的文件合并为一个文件。

小提示:
1.在尾部隐藏了文本数据的图片文件,在使用了其他文件编辑器并保存后,隐藏的文本数据有可能丢失。
2.MP3文件在使用此方法连接后,就可以实现连续播放。
3.合成图片/歌曲这样的二进制文件必须使用/b参数(b代表Binaty,二进制),否则将会失败;另一个合并参数是/a(ASCII,文本文件),只能用于纯文本的合并。两参数不能同时使用,二进制方式可以合并文本文件和二进制文件,而文本方式用于纯文本的合并。

40

帖子

11

主题

0

精华

大宗师

F 币
4252 元
贡献
1857 点

规矩勋章

QQ
5#
 楼主| 发表于 2016-10-14 08:25:17 | 只看该作者
pasuka 发表于 2016-10-13 23:17
最简单的话,先把aa.cube的头10行的数据写入文件pot_new.cub
然后用管道命令添加后续内容
Windows可以dos命 ...

嗯,谢谢pasuka老师,这种方法很简洁,也很简单,速度的话,和上面Li老师的差不多,谢谢你的建议,让我又知道了一种方法。
where is dream,where is home

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

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

地板
发表于 2016-10-13 23:17:53 | 只看该作者
本帖最后由 pasuka 于 2016-10-13 23:20 编辑

最简单的话,先把aa.cube的头10行的数据写入文件pot_new.cub
然后用管道命令添加后续内容
Windows可以dos命令譬如
type pot.cub >> pot_new.cub

40

帖子

11

主题

0

精华

大宗师

F 币
4252 元
贡献
1857 点

规矩勋章

QQ
板凳
 楼主| 发表于 2016-10-13 17:02:01 | 只看该作者
谢谢Li老师,您的这个代码减少了一次复制数据的过程,windows下速度还是不敢恭维,不过Linux系统下可以接受,再次谢谢您。PS:这扩展函数还是很不错的,虽然老大的视频里强调过能不用就不用,但这次不知道有没有其他方法可以替代这个扩展函数。
where is dream,where is home

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
沙发
发表于 2016-10-13 16:43:13 | 只看该作者
[Fortran] 纯文本查看 复制代码
program pot_head
USE IFPORT
implicit none
integer i, j, n, ierr
character(len=512) :: str = ''

open(11,file='aa.cube',status='old') 
open(12,file='temp1')
do i = 1, 10
    read(11,"(a)",iostat=ierr) str
    if(str(9:10)=='E' .or. ierr/=0) exit
		write(12,"(a)") trim(str)
end do
close(11)

open(13,file='pot.cub',status='old')
do
    read(13,"(a)",iostat=ierr) str
    if (ierr/=0) exit
    write(12,"(a)") trim(str)
end do
close(13,status='delete')
close(12)
! ivf扩展函数,改文件名
i = rename('temp1','pot.cub')
if(i==0) then 
	write(*,*) '成功'
else 
	write(*,*) '失败'
end if 
read(*,*)
end program pot_head

评分

参与人数 1贡献 +9 收起 理由
fcode + 9 李老师辛苦了

查看全部评分

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-25 04:33

Powered by Tencent X3.4

© 2013-2024 Tencent

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