回 帖 发 新 帖 刷新版面

主题:一个有关输出的小问题

数据为单列:
   1
   1
   1
  13
  13
  13
  15
  15
  15
  17
  17
  17
  23
  23
  23
  25
  25
  25
  ...

我只需要读一下数,现在每一个都重复了三次,所以想重新输出成三列,然后只读第一列, 也就是

   1
  13
  15
  17
  23
  25
  ...

这样。

我写的源程序是:

      program main

      character(160) :: filename,tmp
    integer m,n
    integer i,line,a

      filename='A_1_'
      print*, 'Please enter the number of files:'
      read*,n
          do m=1,n
        write(tmp,*)m      
        
      open(10,status='old', file=trim(filename)//trim(adjustl(tmp))
    1//'.dat')

    line=1000
      do i = 1,line
      read(10,111,iostat=ios) a
    if (ios /=0) then
    exit
    endif

      open(11,status='unknown',file=trim('B_1_')//trim(adjustl(tmp))
    1//'.dat')
      write(11,112) a

    enddo
      enddo

111   format (3I4)
112   format (I4,2x,2x)
      close(10)
      close(11)

    end

这里的file=trim(filename)//trim(adjustl(tmp)),是说我有许多这一类数据,希望进行批处理。不知道format哪里不对,现在的问题是输出和原数据一样,也是单列然后每个重复三次。请问如何解决?

另外想问一下,输出的时候,能否在同一个文件输出很多列? 比如每个文件二十列(读二十个原文件,然后将结果输出到同一个dat文件里,像下面的举例那样)。这样读起来会更方便。请问这个想法是否可行,以及最多可以有多少列在同一个文件中?

eg:

   1   1   ...
  13   12  ...
  15   13  ...
  17   15  ...
  23   16  ...
  25   19  ...
  ...  ... ...

回复列表 (共24个回复)

21 楼

(4)
   1
  13
  15
  17
  23
  25
  29
  35
  43
  49
  53
  57
  59
  79
  85
  89
  91
  95
 101
 129
 131
 139
 149
 151
 161
 165
 173
 177
 181
 183
 185
 195
 197
 205
 215
 233
 239
 245
 247
 269
 289
 309
 323
 327
 345
 349
 353
 363
 365
 377
 407
 409
 421
 433
 437
 439
 443
 449
 465
 473
 489
 497
 521
 547
 553
 559
 571

(5)

   1
   7
  13
  15
  17
  23
  25
  29
  35
  39
  43
  49
  53
  57
  59
  75
  79
  85
  89
  91
  95
 101
 129
 131
 139
 149
 151
 161
 165
 173
 177
 183
 185
 195
 197
 205
 215
 239
 245
 269
 321
 323
 327
 345
 349
 353
 363
 365
 407
 421
 423
 427
 433
 439
 443
 449
 465
 473
 489
 497
 515
 519
 521
 525
 543
 547
 553
 559
 571

(6)

   1
   7
  13
  15
  17
  23
  25
  29
  35
  39
  43
  49
  51
  53
  59
  79
  89
  91
  95
 101
 117
 129
 131
 149
 151
 165
 173
 177
 181
 183
 195
 197
 205
 215
 233
 239
 245
 269
 321
 323
 327
 337
 345
 349
 353
 363
 377
 387
 407
 421
 427
 433
 437
 439
 443
 449
 465
 473
 489
 519
 521
 547
 559
 565

(7)

   1
   7
  13
  15
  17
  19
  23
  25
  29
  35
  39
  43
  49
  51
  53
  59
  69
  75
  79
  89
  91
  95
 101
 117
 123
 129
 131
 139
 141
 149
 151
 165
 173
 177
 183
 195
 197
 205
 215
 239
 245
 257
 261
 269
 289
 323
 327
 345
 349
 353
 361
 363
 407
 421
 423
 433
 439
 443
 449
 465
 473
 489
 497
 511
 521
 541
 543
 547
 559
 565
 571

22 楼

(8)
   1
   7
  13
  15
  17
  19
  23
  25
  29
  35
  43
  49
  53
  59
  75
  79
  89
  91
  95
 101
 129
 131
 139
 141
 149
 151
 161
 165
 173
 177
 183
 195
 197
 215
 239
 245
 247
 257
 261
 269
 323
 327
 337
 345
 349
 353
 363
 365
 379
 407
 421
 423
 433
 437
 439
 443
 465
 473
 489
 497
 521
 541
 543
 553
 559
 565
 571
 575

(9)

   1
   7
  13
  15
  17
  19
  23
  25
  29
  35
  39
  43
  49
  51
  53
  59
  75
  79
  89
  95
 101
 129
 131
 139
 149
 151
 161
 165
 173
 177
 195
 197
 205
 215
 233
 239
 245
 247
 257
 261
 269
 279
 289
 323
 327
 337
 345
 349
 353
 363
 365
 379
 407
 421
 433
 439
 443
 465
 473
 489
 521
 543
 553
 559
 561
 565
 571
 575

(10)

   1
   7
  13
  15
  17
  19
  23
  25
  29
  35
  43
  49
  53
  59
  75
  79
  89
  95
 101
 123
 129
 131
 139
 149
 151
 165
 177
 183
 195
 197
 205
 215
 239
 257
 263
 269
 323
 327
 345
 349
 353
 363
 379
 407
 421
 433
 439
 443
 465
 473
 489
 521
 541
 543
 547
 553
 559
 565
 571




23 楼

Program Main
      Implicit None
      Type ::  ST_OneFileData
       Integer , pointer:: rData(:)
      End Type
      Type ( ST_OneFileData ) , allocatable :: stAllData(:)
      Integer iNumOfFile ,i ,iNumOfLine ,j ,iCount ,iCompare ,GetFileN
       character(160) :: tmp

      write( * , * ) 'How many files you want to run?'
      read ( * , * ) iNumOfFile
      Allocate( stAllData( iNumOfFile ) )

      Do i = 1 , iNumOfFile
      write(tmp,*)i        
      open(1,file=trim('A_1_')//trim(adjustl(tmp))
    1//'.dat',status='old' )
      iNumOfLine = GetFileN( 1 )
      Allocate( stAllData(i)%rData( iNumOfLine ) )
      Do j = 1 , iNumOfLine
      Read( 1 , * ) stAllData(i)%rData( j )
      End Do
      Close( 1 )
      End Do

       Open( 12 , File = 'Sample.dat' ) 
       Open( 13 , File = 'Result.dat' )
      iNumOfLine = GetFileN( 12 )

      Do i = 1 , iNumOfLine
       iCount = 0
      Read( 12 , * ) iCompare
      write( 13 , 111 ) 'No:',i,'Read:',iCompare
      Do j = 1 , iNumOfFile
      If ( any( stAllData(j)%rData(:) == iCompare ) ) then
        iCount = iCount + 1        
      Else
        write( 13 , * ) iCount
        iCount = 0
      End If
      End Do

      If ( iCount /= 0 ) write( 13 , * ) iCount
      If ( iCount == 0 ) write( 13 , * ) 0    

(尝试后发现这里如果加上 ==0的条件,可以解决一部分‘偶然’缺少0的问题,但没有全部都解决。像对于之前提到的数字75,还是一样有缺少。觉得是如果之后的部分都是0,对于这样的情况就能够解决,但如果像数字75那样之后还重新出现,就会出现缺少0的个数的错误。)


111   format (a4,i5,a8,i4)
      End Do
      Close(13)
      Close(12)

      Deallocate( stAllData )
      End Program

      integer function GetFileN(iFileUnit)
      implicit none
      logical , parameter :: b = .True.
      integer , intent( IN ) :: iFileUnit
      character*(1) :: c
      GetFileN = 0
      rewind( iFileUnit )
    do while (b)
      read( iFileUnit , * ,end =999 ,Err = 999 )c
      GetFileN = GetFileN + 1
      end Do
999   rewind( iFileUnit )
      return
      end function GetFileN

24 楼

我想这个问题是无法通过论坛来解决了。

我已经为你提供了整体思路。个别问题我真的需要你的大量数据(就是那100个数据文件)才能排查。

你这样一个一个帖出来,头绪太乱了。

我认为你应该弄明白这段代码的整体思路,按照这个思路去寻找问题所在。

相信不会很难。

我来回复

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