找回密码
 注册
Simdroid-非首页
查看: 478|回复: 18

[3. Fortran] 关于格式输入输出请教

[复制链接]
发表于 2005-7-1 07:57:45 | 显示全部楼层 |阅读模式 来自 大连理工大学
现在有一段数据如下:
  0.000               0.000               0.000
  0.000            3333.333       260327440.609
  0.000            6666.667       260327440.609
  0.000           11666.667       260327440.609
  0.000           19166.667       260327440.609
  0.000           30416.667       260327440.609
  0.000           47291.667       260327440.609
  0.000           72604.167       260327440.609
  0.000          110572.917       260327440.609
  0.001          167526.042       260327440.609
  0.001          252955.729       260327440.609
  0.001          381100.260       260327440.609
  0.002          573317.057       260327440.609
  0.003          861642.253       260327440.609
  0.005         1294130.046       260327440.609
  0.007         1942861.735       260327440.609
  0.011         2915959.269       260327440.609
  0.017         4375605.570       260327440.609
  0.025         6565075.022       260327440.609
  0.038         9849279.200       260327440.609
  0.051        13182612.534       260327440.609
  0.063        16515945.867       260327440.609
请问能否采用格式化输入?因为数据挺长的,想从其中提取一些数据,请大虾指教!谢谢!
发表于 2005-7-1 08:51:17 | 显示全部楼层 来自 黑龙江哈尔滨

Re:关于格式输入输出请教

Simdroid开发平台
c中可以用fscanf函数

或者用CStdioFile一次读入一行然后分割:
int nSpacePosition;
while(file.ReadString(line))
{
nSpacePosition = line.Find(' ');
if(nSpacePosition==-1)
break;
a=atof(line.Left(nSpacePosition));
line=line.Right(line.GetLength()-nSpacePosition-1);

nSpacePosition = line.Find(' ');
if(nSpacePosition==-1)
break;
b=atof(line.Left(nSpacePosition));

line=line.Right(line.GetLength()-nSpacePosition-1);
c=atof(line.Left(nSpacePosition));

node.a=a;
node.b=b;
node.c=c;

array.add(node);
}
发表于 2005-7-1 09:04:53 | 显示全部楼层 来自 黑龙江哈尔滨

Re:关于格式输入输出请教

pascal中就更简单:
assign(file,'filename');reset(file);
for i:=1 to n do
begin
readln(file,a,b,c);
{do your work here}
end;
发表于 2005-7-1 10:24:24 | 显示全部楼层 来自 黑龙江哈尔滨

Re:关于格式输入输出请教

iwtry, 你的意思是要定位在数据文件的某个位置,读入一定数量的数据? 还是在每一行只读入某个数据?
 楼主| 发表于 2005-7-3 13:57:42 | 显示全部楼层 来自 大连理工大学

Re:关于格式输入输出请教

我是想在数据文件的某个位置开始,读取一行中的两个数,连续读几行,然后在定位到另一位置继续读取。不知道有没有讲明白,自己试着用fortran中的格式化读取写了一下,没有达到目的,最好只好用顺序读取一行一行读了,但是觉得方法很笨。想请教更快捷的方法。谢谢!
发表于 2005-7-4 16:31:00 | 显示全部楼层 来自 江苏南京

Re:关于格式输入输出请教

不知道我的理解是不中是你所要求的,我用FORTRAN编了一个程序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2005-7-4 16:34:35 | 显示全部楼层 来自 江苏南京

Re:关于格式输入输出请教

原文件:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2005-7-4 16:36:44 | 显示全部楼层 来自 江苏南京

Re:关于格式输入输出请教

结果文件:
从第三行读起,读后两个数。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2005-7-4 19:30:15 | 显示全部楼层 来自 黑龙江哈尔滨

Re:关于格式输入输出请教

要定位的话,似乎只有用直接存取方法,直接读取某一个记录。但是要求每条记录的长度都是一致的。
发表于 2005-7-5 10:52:32 | 显示全部楼层 来自 清华大学

Re:关于格式输入输出请教

必须在数据生成的时候就定义好记录长度,这样才能保证后面的直接读取正确。

评分

1

查看全部评分

 楼主| 发表于 2005-7-5 14:30:10 | 显示全部楼层 来自 大连理工大学

Re:关于格式输入输出请教

谢谢大家的帮忙,我自己写了一格式读入程序完成自己想要的提取,请大家指教。
IMPLICIT NONE
INTEGER I,J
REAL*8 AA,BB,CC
CHARACTER(LEN=80)::FILENAME1,FILENAME2
LOGICAL ALIVE
INTEGER NSUM,NNO,NM,NN

WRITE(*,*)'提取数据所在文件名:'
READ(*,*)FILENAME1
INQUIRE(FILE=FILENAME1,EXIST=ALIVE)
IF(.NOT.ALIVE) THEN
  WRITE(*,*)TRIM(FILENAME1),'不存在!'
  STOP
ENDIF
WRITE(*,*)'结果数据存放文件:'
READ(*,*)FILENAME2

OPEN(UNIT=100,FILE=FILENAME1,form='formatted',access='direct',recl=47)
OPEN(UNIT=200,FILE=FILENAME2,STATUS='UNKNOWN')

WRITE(*,*)'总的提取数据组数(1000):'
READ(*,*)NSUM
WRITE(*,*)'每组提取数据个数(48):'
READ(*,*)NN
WRITE(*,*)'从第几行提取数据:'
READ(*,*)NNO
WRITE(*,*)'提取数据行数:'
READ(*,*)NM

DO I=1,NSUM
  DO J=1,NM
    READ(100,"(F5.3,2F20.3)",REC=NN*(I-1)+NNO+J-1)AA,BB,CC
    WRITE(200,"(F5.3,2F20.3)")AA,BB,CC
  ENDDO
  WRITE(200,"(//)")
ENDDO

END
发表于 2005-7-5 15:25:15 | 显示全部楼层 来自 黑龙江哈尔滨

Re:关于格式输入输出请教

挺好啊,给个数据文件大家试试看?
 楼主| 发表于 2005-7-8 11:46:32 | 显示全部楼层 来自 大连理工大学

Re:关于格式输入输出请教

不知道怎么回事,发贴老提示文章不存在,重复了好多次还是不行,没办法,只好贴在这里了,原来数据有1000组,现在贴了3组供大家测试
0.000               0.000               0.000
0.000            3333.333       260327440.609
0.000            6666.667       260327440.609
0.000           11666.667       260327440.609
0.000           19166.667       260327440.609
0.000           30416.667       260327440.609
0.000           47291.667       260327440.609
0.000           72604.167       260327440.609
0.000          110572.917       260327440.609
0.001          167526.042       260327440.609
0.001          252955.729       260327440.609
0.001          381100.260       260327440.609
0.002          573317.057       260327440.609
0.003          861642.253       260327440.609
0.005         1294130.046       260327440.609
0.007         1942861.735       260327440.609
0.011         2915959.269       260327440.609
0.017         4375605.570       260327440.609
0.025         6565075.022       260327440.609
0.038         9849279.200       260327440.609
0.051        13182612.534       260327440.609
0.063        16515945.867       260327440.609
0.076        19849279.200       260327440.609
0.089        23182612.534       260327440.609
0.102        26515945.867       260327440.609
0.115        29849279.200       260327440.609
0.127        33182612.534       260327440.609
0.140        36515945.867       260327440.609
0.153        39849279.200       259867889.105
0.167        43182612.534       258128117.672
0.183        46515944.764       254766888.546
0.200        49849397.209       249526756.089
0.225        53182581.097       235996491.630
0.279        56502206.227       202354774.806
0.343        59849676.771       174247394.761
0.413        62928693.071       152263398.203
0.490        66321986.678       135477325.436
0.573        69843553.810       121940055.086
0.662        73157854.559       110547602.942
0.753        76464834.768       101486431.147
0.850        79775605.825        93904346.968
0.947        83076844.727        87746087.488
1.048        86405736.023        82434219.242
1.151        89708660.526        77912682.730
1.256        92949985.057        73983002.553
1.366        96052932.136        70323676.869
1.415        98226135.862        69424146.299
1.473        99963687.430        67858820.092
0.000               0.000               0.000
0.000            3333.333       305974411.729
0.000            6666.667       305974411.729
0.000           11666.667       305974411.729
0.000           19166.667       305974411.729
0.000           30416.667       305974411.729
0.000           47291.667       305974411.729
0.000           72604.167       305974411.729
0.000          110572.917       305974411.729
0.001          167526.042       305974411.729
0.001          252955.729       305974411.729
0.001          381100.260       305974411.729
0.002          573317.057       305974411.729
0.003          861642.253       305974411.729
0.004         1294130.046       305974411.729
0.006         1942861.735       305974411.729
0.010         2915959.269       305974411.729
0.014         4375605.570       305974411.729
0.021         6565075.022       305974411.729
0.032         9849279.200       305974411.729
0.043        13182612.534       305974411.729
0.054        16515945.867       305974411.729
0.065        19849279.200       305974411.729
0.076        23182612.534       305974411.729
0.087        26515945.867       305974411.729
0.098        29849279.200       305974411.729
0.108        33182612.534       305974411.729
0.119        36515945.867       305974411.729
0.130        39849279.200       305974411.729
0.142        43182612.534       303701505.358
0.155        46515945.867       300003689.457
0.170        49849276.725       293753372.140
0.191        53182607.215       277887124.916
0.238        56506025.898       237873049.255
0.295        59609474.112       202068189.049
0.360        62939994.193       175016571.597
0.430        66512280.983       154547760.165
0.508        69841590.957       137551145.742
0.592        73175176.910       123687808.471
0.679        76241175.455       112217985.316
0.771        79799369.091       103503467.907
0.865        83091596.896        96047763.861
0.962        86446650.461        89872843.770
1.063        89695817.279        84412870.364
1.165        93005960.410        79844934.128
1.269        96153306.718        75744329.400
1.318        97823974.664        74196421.140
1.375        99540605.308        72374300.113
0.000               0.000               0.000
0.000            3333.333       273266227.522
0.000            6666.667       273266227.522
0.000           11666.667       273266227.522
0.000           19166.667       273266227.522
0.000           30416.667       273266227.522
0.000           47291.667       273266227.522
0.000           72604.167       273266227.522
0.000          110572.917       273266227.522
0.001          167526.042       273266227.522
0.001          252955.729       273266227.522
0.001          381100.260       273266227.522
0.002          573317.057       273266227.522
0.003          861642.253       273266227.522
0.005         1294130.046       273266227.522
0.007         1942861.735       273266227.522
0.011         2915959.269       273266227.522
0.016         4375605.570       273266227.522
0.024         6565075.022       273266227.522
0.036         9849279.200       273266227.522
0.048        13182612.534       273266227.522
0.060        16515945.867       273266227.522
0.073        19849279.200       273266227.522
0.085        23182612.534       273266227.522
0.097        26515945.867       273266227.522
0.109        29849279.200       273266227.522
0.121        33182612.534       273266227.522
0.134        36515945.867       273266227.522
0.146        39849279.200       272240675.721
0.160        43182612.534       269691760.765
0.175        46515945.529       265050364.684
0.196        49849277.375       253690042.803
0.240        53178953.014       221709947.036
0.299        56510875.707       188818611.816
0.367        59622105.753       162434916.019
0.442        63180015.187       143092478.778
0.523        66508046.154       127277148.621
0.611        69839923.731       114395811.873
0.704        72953522.801       103673414.482
0.800        76475028.658        95593895.292
0.900        79776740.171        88638191.382
1.002        83116160.692        82979825.847
1.108        86372417.289        77954186.582
1.216        89692953.364        73777147.359
1.326        92985240.489        70125027.274
1.440        96261489.548        66856689.133
1.491        97830679.026        65613791.797
1.552        99949042.692        64402143.840
发表于 2005-7-9 09:41:21 | 显示全部楼层 来自 北京

Re:关于格式输入输出请教

我直接将数据文件存成test.txt文件,
结果如下
  1.   提取数据所在文件名:
  2. test.txt
  3. 结果数据存放文件:
  4. result.txt
  5. 总的提取数据组数(1000):
  6. 2
  7. 每组提取数据个数(48):
  8. 10
  9. 从第几行提取数据:
  10. 2
  11. 提取数据行数:
  12. 2
  13. forrtl: severe (64): input conversion error, unit 100, file E:\program\fortran p
  14. rogram\read data3\test.txt
  15. Image              PC        Routine            Line        Source
  16. Text.exe           0040F7B9  Unknown               Unknown  Unknown
  17. Text.exe           0040F5EB  Unknown               Unknown  Unknown
  18. Text.exe           0040E7F4  Unknown               Unknown  Unknown
  19. Text.exe           0040EC29  Unknown               Unknown  Unknown
  20. Text.exe           0040B252  Unknown               Unknown  Unknown
  21. Text.exe           00401632  Unknown               Unknown  Unknown
  22. Text.exe           00438B39  Unknown               Unknown  Unknown
  23. Text.exe           0042E314  Unknown               Unknown  Unknown
  24. kernel32.dll       7C816D4F  Unknown               Unknown  Unknown
  25. Incrementally linked image--PC correlation disabled.
  26. Press any key to continue
复制代码
发表于 2005-7-9 11:09:27 | 显示全部楼层 来自 黑龙江哈尔滨

Re:关于格式输入输出请教

s b n wrote:
必须在数据生成的时候就定义好记录长度,这样才能保证后面的直接读取正确。

看来问题在这里了,呵呵
发表于 2005-7-9 17:13:48 | 显示全部楼层 来自 北京

Re:关于格式输入输出请教

你只是用了一个read(1,100)
就从第三行开始读了,
如果我想从第二行开始读后两个数怎么办?
huahua2005 wrote:
结果文件:
从第三行读起,读后两个数。。。
发表于 2005-7-9 17:23:08 | 显示全部楼层 来自 北京

Re:关于格式输入输出请教

输出结果后面的数小数点后面的.609编成了.000,高手指点怎么回事?
huahua2005 wrote:
不知道我的理解是不中是你所要求的,我用FORTRAN编了一个程序
 楼主| 发表于 2005-7-9 21:59:59 | 显示全部楼层 来自 大连理工大学

Re:关于格式输入输出请教

quartzbj
你的那个.609变成.000可能有由于数据类型不是双精度定义造成的,
还有我贴的就是我机器上的程序,而且我按照你操作的进行提取也是可以的
提取数据所在文件名:
input.txt
结果数据存放文件:
out.txt
总的提取数据组数(1000):
2
每组提取数据个数(48):
10
从第几行提取数据:
2
提取数据行数:
2
Press any key to continue
出错原因可能是因为你是直接将我的数据文件考过去了,在我的输入文件中数据格式是这样的
f5.3,f20.3,f20.3
因为贴的时候,这里省略了空格了,你改格式试试?
发表于 2005-7-10 09:28:35 | 显示全部楼层 来自 湖北武汉

Re:关于格式输入输出请教

苍山负雪 wrote:
iwtry, 你的意思是要定位在数据文件的某个位置,读入一定数量的数据? 还是在每一行只读入某个数据?
是啊,把问题说清楚!
并且你打算使用哪种语言等
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-2 01:34 , Processed in 0.077700 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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