回 帖 发 新 帖 刷新版面

主题:请教一个很古怪的读写问题

数据如下:

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 楼

再次请教大伙,关于自由读取* ,数据格格式如下
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 楼

关于不对齐的数据如何读,还要看你的期望。

你是期望怎么处理不完整的数据呢?跳过?还是设置默认值?

如果自由格式都读不了,那你有格式读入更要出错的。

13 楼

对于上面的数据,我期望是能够全部读取出来,因为这是最基本的操作步骤,这个用格式化的方法很好读取,我就是想学一下自由读取的方法,所以请教下石头哥

14 楼

我不明白你怎么格式读取,给我看看你的代码?

这个问题的关键其实不是怎么读,而是怎么存储在内存里。

你打算用什么结构去存?

15 楼

麻烦石头哥了,代码如下:

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 楼

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 楼

[quote]对于上面的数据,我期望是能够全部读取出来,因为这是最基本的操作步骤,这个用格式化的方法很好读取,我就是想学一下自由读取的方法,所以请教下石头哥[/quote]

按照你所说,你可以用格式化读取完成这件事情。

我想看看你的格式化读取的代码。

正如我说的那样,这个问题的关键不在于如何读,而在于如何处理不完全的数据!!!!

对于不完整的行,你要如何处理??是跳过???还是其他方式???

你始终没有回答我的这个问题,我只能要你“格式化读取”的代码,以便了解你对不完整数据行如何处理的期望了。

18 楼

啊,是我没明白你的意思,不好意思哈,这下知道了,我尝试过的格式化读取的代码如下:

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 楼

越来越糊涂了。

你到底要实现什么目的??

一开始,你有 write(12 ,要写到另一个文件里。

后来,又没了,貌似只是统计一下完整的数据有多少列。

我不明白你所谓的“不跳过,不转存,却要读出来”

既然读出来,你拿什么去存储不完整的数据??又不能跳过。你不转存,读出来做什么?有什么意义?

20 楼


哈哈,这么说吧,我这小代码只是用来剔除数据的,从11里读出来,剔除掉1,3列不需要的数据,然后写入12文件里,后来受到你的启发,使用*来自由读取,我就把它简化了,只需要读出来就可以了,当然最后也还是要写入12里头的,统计行数是为了看代码进行到了哪一行,或者是到了哪一行出了问题,这是我个人的小小习惯哈[em12]

我来回复

您尚未登录,请登录后再回复。点此登录或注册