主题:请教一个很古怪的读写问题
GuiltyOne [专家分:60] 发布于 2012-09-07 09:18:00
数据如下:
AH ANQ 714 30.583 117.022 75
AH BEB 67 32.90550 117.2974 49.00000
AH BZY 4973 31.39860 116.2164 240.0000
我读取的方式为:
character*5 nam
real*8 weid,jingd,gaod
do while(.not.eof(11))
read(11,'(4x,a5,9x,f8.5,3x,f9.5,3x,f9.3)')nam,weid,jingd,gaod
write(12,'(a5,2x,f8.5,2x,f9.5,2x,f9.3)')nam,weid,jingd,gaod
enddo
得到的结果为:
ANQ 30.58300 117.02200 0.075
BEB 32.90550 117.29740 49.000
BZY 31.39860 116.21640 240.000
问题:同样是浮点数据,为什么第一行的75活生生的就变成了0.075了,而其他的数据却没有问题?
回复列表 (共26个回复)
11 楼
GuiltyOne [专家分:60] 发布于 2012-09-12 15:31:00
再次请教大伙,关于自由读取* ,数据格格式如下
AH ANQ 714 30.583 117.022 75
AH BEB 67 32.90550 117.2974 49.00000
AH BZY 4973 31.39860 116.2164 240.0000
AH DYN 107 32.64420 117.4689 196.0000
AH FYT 35 32.94600 115.8031 42.00000
AH FZL 3586 31.34870 116.2704 119.0000
AH FZL1 3 31.34870 116.2704 119.0000
AH HBE 211 33.98170 116.7900 90.00000
AH HNA 55 32.63350 116.8039 86.00000
AH HUS 19 29.70610 118.2803 130.0000
AH JAS 27 32.81060 118.2625 95.00000
AH JZA 118 31.68890 115.8839 50.00000
AH LAN 284 31.71500 116.5010 60.00000
AH LNA 4873 31.34000 116.1300 424.0000
AH MCG1 47 33.35000 116.4800 55.00000
AH SIX 23 33.55760 117.8591 42.00000
AH SJH 4779 31.43610 116.0859 240.0000
AH TOL 168 30.92460 117.8190 49.00000
BJ BBS 566 39.91390 116.2411 58.00000
BJ CIQ 4 39.78640 116.5668 -174.0000
BJ DHC 1004 39.86120 116.1093 142.3940
BJ L01 100
BJ L02 31
BJ L03 27
BJ L04 322
BJ L05 128
BJ L06 35
BJ L07 283
BJ L08 192
BJ L09 46
BJ L11 84
BJ L12 30
BJ L13 29
BJ L14 52
BJ L15 51
BJ L16 44
BJ L17 81
BJ L18 274
BJ L19 35
BJ L20 49
BJ L21 104
BJ LBP 1867 40.56900 116.1989 577.9640
BJ LLM 2963 40.62940 116.6376 500.0000
BJ MAF 1253 40.04580 116.9977 -255.0000
BJ MIY 2007 40.46670 116.8333 107.0000
很想问一下用自由读取该怎么读,我运行的时候中间没有4,5,6列的那些数据会读不下去,显示输入格式错误
12 楼
臭石头雪球 [专家分:23030] 发布于 2012-09-12 15:51:00
关于不对齐的数据如何读,还要看你的期望。
你是期望怎么处理不完整的数据呢?跳过?还是设置默认值?
如果自由格式都读不了,那你有格式读入更要出错的。
13 楼
GuiltyOne [专家分:60] 发布于 2012-09-14 17:13:00
对于上面的数据,我期望是能够全部读取出来,因为这是最基本的操作步骤,这个用格式化的方法很好读取,我就是想学一下自由读取的方法,所以请教下石头哥
14 楼
臭石头雪球 [专家分:23030] 发布于 2012-09-14 17:28:00
我不明白你怎么格式读取,给我看看你的代码?
这个问题的关键其实不是怎么读,而是怎么存储在内存里。
你打算用什么结构去存?
15 楼
GuiltyOne [专家分:60] 发布于 2012-09-14 18:47:00
麻烦石头哥了,代码如下:
character*5 nam,dummy*4,dummy2*9
real weid,jingd,gaod
integer n
open(11,file='jiang')
n=0
do while(.not.eof(11))
n=n+1
read(11,*)dummy,nam,dummy2,weid,jingd,gaod
write(*,*)n
enddo
end
我尝试着把上面列出的数据全都读出来,但是一旦到了第21行就卡住,我个人觉得是中间那部分缺了后三列的数据没有读出来。
另外,关于你问的使用什么结构去存储,我是新手,不是很了解数据的存储方式,我只是单纯的希望能通过非数组的方法读出来,因为这里读取的数据不涉及矩阵运算,只有读和写两个过程。
16 楼
GuiltyOne [专家分:60] 发布于 2012-09-14 18:55:00
jiang 这个文件格式,我截取了前100行,总共很长,都是类似的后三列不规则数据体:
AH ANQ 714 30.583 117.022 75
AH BEB 67 32.90550 117.2974 49.00000
AH BZY 4973 31.39860 116.2164 240.0000
AH DYN 107 32.64420 117.4689 196.0000
AH FYT 35 32.94600 115.8031 42.00000
AH FZL 3586 31.34870 116.2704 119.0000
AH FZL1 3 31.34870 116.2704 119.0000
AH HBE 211 33.98170 116.7900 90.00000
AH HNA 55 32.63350 116.8039 86.00000
AH HUS 19 29.70610 118.2803 130.0000
AH JAS 27 32.81060 118.2625 95.00000
AH JZA 118 31.68890 115.8839 50.00000
AH LAN 284 31.71500 116.5010 60.00000
AH LNA 4873 31.34000 116.1300 424.0000
AH MCG1 47 33.35000 116.4800 55.00000
AH SIX 23 33.55760 117.8591 42.00000
AH SJH 4779 31.43610 116.0859 240.0000
AH TOL 168 30.92460 117.8190 49.00000
BJ BBS 566 39.91390 116.2411 58.00000
BJ CIQ 4 39.78640 116.5668 -174.0000
BJ DHC 1004 39.86120 116.1093 142.3940
BJ L01 100
BJ L02 31
BJ L03 27
BJ L04 322
BJ L05 128
BJ L06 35
BJ L07 283
BJ L08 192
BJ L09 46
BJ L11 84
BJ L12 30
BJ L13 29
BJ L14 52
BJ L15 51
BJ L16 44
BJ L17 81
BJ L18 274
BJ L19 35
BJ L20 49
BJ L21 104
BJ LBP 1867 40.56900 116.1989 577.9640
BJ LLM 2963 40.62940 116.6376 500.0000
BJ MAF 1253 40.04580 116.9977 -255.0000
BJ MIY 2007 40.46670 116.8333 107.0000
BJ NKY 1611 39.69170 115.9733 69.14000
BJ NLS 439 40.21010 116.6549 -160.0000
BJ SSL 879 40.25030 116.2252 104.5900
BJ SZJ 144 39.97890 116.3019 -118.0000
BJ TIT 334 39.88560 116.4059 -210.0000
BJ XIJ 668 39.83000 116.8835 -283.0000
BJ YAZ 397 40.15310 116.8250 -158.0000
BJ YUF 129 39.52070 116.3155 -172.0000
BJ ZHT 1479 39.96180 115.6798 500.0000
BU BD1 13
BU BDH 3136 39.82580 119.4778 20.00000
BU CD1 3
BU CDT 841 41.014 117.914 350
BU CH1 17
BU CHL 7311 39.75850 119.0962 74.97000
BU DOH 2401 39.73620 118.2947 55.42000
BU DSQ 964 40.08150 116.4147 -212.8000
BU FHS 195 39.89870 116.3102 61.00000
BU GO1 11
BU GUY 4170
BU HB1 19
BU HBZ 940 38.24820 114.3083 132.9800
BU HU1 3
BU HUA 1248 40.65300 114.4415 824.7400
BU LA1 31
BU LAY 2825 39.51020 114.9814 877.5500
BU LQS 2118 40.10170 116.0817 200.0000
BU MDY 1536 40.39440 116.5602 155.2300
BU NSC 1689 40.14000 117.2543 110.2400
BU QSD 122 40.31680 115.9666 1158.850
BU SFS 1715 39.66110 115.8138 175.3200
BU SHC 713 40.44270 115.5223 636.1800
BU SZL 2056 40.30690 117.2169 1060.000
BU TST 1310 40.53700 117.1276 189.6000
BU WAX 1152 38.86230 115.0635 100.2000
BU WEA 313 38.84690 116.4535 -290.7200
BU XOX 53
BU XUH 1558 40.478 115.042 820
BU ZHL 1449 40.15720 115.1331 1100.000
BU ZJ1 7
BU ZJT 858 40.825 114.903 827
BU ZKD 1067 39.68810 115.9222 120.0000
BU ZU1 59
BU ZUH 4189 40.18690 117.6608 124.8000
CB AXX 11614 40.51500 95.80000 1195.000
CB BCH1 4178 39.82600 78.75800 1110.000
CB BJI 16365 40.03900 116.1750 43.00000
CB BKO1 16605 43.57300 93.01400 1720.000
CB BNX 20324 45.73900 127.4030 195.0000
CB BTA1 14772 30.01000 99.11700 2620.000
CB BTO 1348 40.59700 110.0310 1076.000
CB CAD 4601 30.517 97.167 4000
CB CIF 6314 42.29200 118.9750 573.0000
CB CN2 18510 43.80000 125.4470 233.0000
CB CNS1 2820 28.18200 112.9310 81.00000
17 楼
臭石头雪球 [专家分:23030] 发布于 2012-09-15 09:06:00
[quote]对于上面的数据,我期望是能够全部读取出来,因为这是最基本的操作步骤,这个用格式化的方法很好读取,我就是想学一下自由读取的方法,所以请教下石头哥[/quote]
按照你所说,你可以用格式化读取完成这件事情。
我想看看你的格式化读取的代码。
正如我说的那样,这个问题的关键不在于如何读,而在于如何处理不完全的数据!!!!
对于不完整的行,你要如何处理??是跳过???还是其他方式???
你始终没有回答我的这个问题,我只能要你“格式化读取”的代码,以便了解你对不完整数据行如何处理的期望了。
18 楼
GuiltyOne [专家分:60] 发布于 2012-09-15 12:24:00
啊,是我没明白你的意思,不好意思哈,这下知道了,我尝试过的格式化读取的代码如下:
program main
implicit none
character*5 nam,content*32
integer n
open(11,file='jiang')
n=0
do while(.not.eof(11))
n=n+1
read(11,'(4x,a5,9x,a32)')nam,content
write(*,*)n
enddo
end
对于不完整的行,我的期望是把他们也一起读出来,不跳过,不转存,只是原封不动的读出来罢了
19 楼
臭石头雪球 [专家分:23030] 发布于 2012-09-15 12:50:00
越来越糊涂了。
你到底要实现什么目的??
一开始,你有 write(12 ,要写到另一个文件里。
后来,又没了,貌似只是统计一下完整的数据有多少列。
我不明白你所谓的“不跳过,不转存,却要读出来”
既然读出来,你拿什么去存储不完整的数据??又不能跳过。你不转存,读出来做什么?有什么意义?
20 楼
GuiltyOne [专家分:60] 发布于 2012-09-15 15:12:00
哈哈,这么说吧,我这小代码只是用来剔除数据的,从11里读出来,剔除掉1,3列不需要的数据,然后写入12文件里,后来受到你的启发,使用*来自由读取,我就把它简化了,只需要读出来就可以了,当然最后也还是要写入12里头的,统计行数是为了看代码进行到了哪一行,或者是到了哪一行出了问题,这是我个人的小小习惯哈[em12]
我来回复