主题:一个有关输出的小问题
NMRD
[专家分:40] 发布于 2012-01-16 19:06:00
数据为单列:
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 楼
NMRD [专家分:40] 发布于 2012-01-18 21:44:00
(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 楼
NMRD [专家分:40] 发布于 2012-01-18 21:45:00
(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 楼
NMRD [专家分:40] 发布于 2012-01-18 21:47:00
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 楼
臭石头雪球 [专家分:23030] 发布于 2012-01-20 11:58:00
我想这个问题是无法通过论坛来解决了。
我已经为你提供了整体思路。个别问题我真的需要你的大量数据(就是那100个数据文件)才能排查。
你这样一个一个帖出来,头绪太乱了。
我认为你应该弄明白这段代码的整体思路,按照这个思路去寻找问题所在。
相信不会很难。
我来回复