主题:急救文件处理
			 yanji0403
				 [专家分:0]  发布于 2010-03-23 09:55:00
 yanji0403
				 [专家分:0]  发布于 2010-03-23 09:55:00							
			ITEM: BOX BOUNDS                                            
-0.0821485 49.0281                                          
-0.0821485 49.0281                                          
-15 67                                                      
ITEM: ATOMS id type x y z                                   
1586 1 6.48048 3.69877 -10.7853                             
1587 1 5.50828 2.37501 -11.4744                             
4146 1 3.04137 9.13152 -14.8948                             
……
ITEM: ATOMS id type x y z                                   
1596 1 5.48048 3.69877 -10.7853                             
1487 1 5.50828 2.37501 -11.4744                             
4146 1 3.04137 9.13152 -14.8948                             
……
我想提出每个 ITEM: ATOMS id type x y z 的数据赋给数组,文件里面 ITEM: ATOMS id type x y z   下的   数据行和列是相等的,怎么编程,急救,谢谢。我还想知道怎么用fortran判断读取文件结束。                  
						
					 
		
			
回复列表 (共9个回复)
		
								
				沙发
				
					 zhangghost [专家分:40]  发布于 2010-03-23 17:27:00
zhangghost [专家分:40]  发布于 2010-03-23 17:27:00				
				    Open(10,file="")
100    Do
        Read(10,err=100,end=150) your_read_list 
    EndDo
150    Close(10)
							 
						
				板凳
				
					 yanji0403 [专家分:0]  发布于 2010-03-24 10:07:00
yanji0403 [专家分:0]  发布于 2010-03-24 10:07:00				
				
谢谢zhangghost的回答,小弟刚学fortran不久,弱弱的问下,  怎么才能保证提取的是 ITEM: ATOMS id type x y z  下的数据,把这些数据赋值给数组,能写的在详细些吗?
							 
						
				3 楼
				
					 anney169 [专家分:130]  发布于 2010-03-24 10:24:00
anney169 [专家分:130]  发布于 2010-03-24 10:24:00				
				read之后再write出来就可以知道了,e.g.
假设你的文件名是ITEM.dat,文件总共有n行
         
         integer,parameter :: n
         integer :: atom,id
         real :: ix,iy,iz
         dimension :: ix(n),iy(n),iz(n),atom(n),id(n)
        
         open(unit=10,file='ITEM.dat')
         open(unit=6,file='out.dat')
         do i = 1,n
            read(10,*) atom(i),id(i),ix(i),iy(i),iz(i)
            write(6,*) atom(i),id(i),ix(i),iy(i),iz(i)
         end do
         
         close(10)
         close(6)
   这样你就可以在文件out.dat 中查看读入是否正确,write中“*”的格式可以自己定义,read中就最好不要,如果你不知道这些数据是以什么格式写入的话。
							 
						
				4 楼
				
					 zhangghost [专家分:40]  发布于 2010-03-24 16:51:00
zhangghost [专家分:40]  发布于 2010-03-24 16:51:00				
				Open(10,file="")
100    Do
        Read(10,err=100,end=150) ATOMS,id,type,x,y,z
    EndDo
150    Close(10)
如果每行没有读到六个数,则err,返回100,如果读到文件结尾,则end=150,返回到150行继续读。
这样就保证了只读含有数据ATOMS id type x y z的行,而不是这个格式的行将不读取。
							 
						
				5 楼
				
					 yanji0403 [专家分:0]  发布于 2010-03-24 18:27:00
yanji0403 [专家分:0]  发布于 2010-03-24 18:27:00				
				
那有没有办法 遇到ITEM: ATOMS id type x y z 这个字符串就读下面的数据呢?谢谢!
							 
						
				6 楼
				
					 yanji0403 [专家分:0]  发布于 2010-03-24 18:30:00
yanji0403 [专家分:0]  发布于 2010-03-24 18:30:00				
				首先非常感谢你的回答,fortran能办到 遇到“ITEM: ATOMS id type x y z”这个字符串就读下面的数据吗?
							 
						
				7 楼
				
					 anney169 [专家分:130]  发布于 2010-03-25 11:17:00
anney169 [专家分:130]  发布于 2010-03-25 11:17:00				
				在OPEN之后做一个if判断,把"ITEM: ATOMS id type x y z" 赋值给一个字符型参量(25个字符),读取文件中的前(25个字符)赋值给另一个参量,比较两者是否相等,是就接着下面的do循环读取数据,否则就跳出do循环。
							 
						
				8 楼
				
					 yanji0403 [专家分:0]  发布于 2010-03-29 16:11:00
yanji0403 [专家分:0]  发布于 2010-03-29 16:11:00				
				
program ex
implicit none
integer,parameter :: a=20
         integer :: atom,id,i
         real :: ix,iy,iz
         dimension :: ix(a),iy(a),iz(a),atom(a),id(a)
        
         open(unit=10,file='atommole.txt')
         open(unit=6,file='out.dat')
         do i = 1,a
            read(10,*) atom(i),id(i),ix(i),iy(i),iz(i)
            write(6,*) atom(i),id(i),ix(i),iy(i),iz(i)
         end do
         
         close(10)
         close(6)
请问调试上面程序出现Error: Syntax error, found END-OF-FILE when expecting one of: <LABEL> <END-OF-STATEMENT> ; BLOCK BLOCKDATA PROGRAM TYPE COMPLEX BYTE CHARACTER ...
         close(6)是什么原因,谢谢
							 
						
				9 楼
				
					 yanji0403 [专家分:0]  发布于 2010-03-30 10:17:00
yanji0403 [专家分:0]  发布于 2010-03-30 10:17:00				
				兄弟,能具体写一下吗?我还是个初学者,非常感谢
							 
									
			
我来回复