hipeilei 发表于 2015-10-30 17:34:48

Fortran文件读入问题

本帖最后由 hipeilei 于 2015-10-30 17:36 编辑

在Fortran下读入一个txt文本文件,VS2013+IVF2013编译可以通过,但一运行出现命令行窗口VS程序就会停止工作,但是在sliverforst Plato下可以运行,我感觉一直是VS的问题,应该不是我的代码的问题,在VS2010上也是一样报错,这就很让人纠结。请大神指点一二,如果你可以正确读入,请麻烦给个指点或者说明。谢谢!以下附上要读入的txt文件。





fcode 发表于 2015-10-30 17:37:40

任何数据都是可以被读入的。就看你怎么读而已。
所以,给出你的代码吧。
{:5_122:}

hipeilei 发表于 2015-10-30 21:34:00

fcode 发表于 2015-10-30 17:37
任何数据都是可以被读入的。就看你怎么读而已。
所以,给出你的代码吧。
...
这是代码,请指教,其中data.txt文件每一行第一个是编号,第二个和第三个分别是x坐标和y坐标,要把编号和坐标读出来。
program main
implicit none
integer::i_node,i_element
integer::n_node1,n_elemnet1,
integer,allocatable::ij_element1(:,:)
real(8),allocatable::coordinate_n1(:,:)

open(unit=4,file='data.txt',form='formatted',status='old')
read(4,*)n_node1,n_element1
allocate(ij_element1(n_node1,4),coordinate_n1&(n_node1,2)

!读入数据.

do i_node=1,n_node1
read(4,*)coordinate_n1(i_node,1),coordinate_n1(i_node,2)
end do
do i_element=1,n_element1
read(4,*)ij_element1(i_element,:)

fcode 发表于 2015-10-30 22:58:47

代码不全

hipeilei 发表于 2015-10-31 11:45:04

fcode 发表于 2015-10-30 22:58
代码不全
我知道问题了,是我Open语法是按照老格式写的,现在改了一下open格式就没问题了,这是测试代码:
program main
    implicit none
    integer::i,x
    real::y,z
    open(12,file="data.txt")
    open(13,file="data1.txt")
    do i=1,100
    read(12,*)x,y,z
    write(*,*)x,y,z
    write(13,*)x,y,z
    enddo
    pause
    end

fcode 发表于 2015-10-31 12:19:11

我想你应该再找找原因。你之前的代码里,都是符合 Open 语句的现今语法的,我认为这不是问题的原因。

hipeilei 发表于 2015-10-31 15:26:04

fcode 发表于 2015-10-31 12:19
我想你应该再找找原因。你之前的代码里,都是符合 Open 语句的现今语法的,我认为这不是问题的原因。 ...
这是我之前的代码,我的水平有限,实在找不出来哪里有问题,如果方便劳驾帮我看看,谢谢。
program Mesh_reflection
implicit none
integer::i_node,i_element
integer::n_node1,n_element1,n_node2,n_element2
integer,allocatable::ij_element1(:,:),ij_element2(:,:)
real(8),allocatable::coordinate_n1(:,:),coordinate_n2(:,:),stress_1(:,:),stress_2(:,:)
open(unit=4,file="data.txt")
open(unit=5,file="mdata_new.txt")
read(4,*)n_node1,n_element1
read(5,*)n_node2,n_element2
allocate(ij_element1(n_node1,4),ij_element2(n_node2,4),coordinate_n1(n_node1,2),coordinate_n2(n_node2,2) ,stress_1(n_node1,4),stress_2(n_node2,4))
!读入数据.
do i_node=1,n_node1
read(4,*)coordinate_n1(i_node,1),coordinate_n1(i_node,2)
end do
do i_element=1,n_element1
read(4,*)ij_element1(i_element,:)
end do
do i_node=1,n_node2
read(5,*)coordinate_n2(i_node,:)
end do
do i_element=1,n_element2
read(5,*)ij_element2(i_element,:)
enddo
write(4,*)coordinate_n1(i_node,1),coordinate_n1(i_node,2)
endprogram

fcode 发表于 2015-10-31 15:53:03

对比你前后的两个代码,你并没有解决问题。而是把代码改得更简单,功能更少,以此“回避”了所有问题。

请看以下代码的注释内容:
program Mesh_reflection
implicit none
integer::i_node,i_element
integer::n_node1,n_element1!,n_node2 ,n_element2 !//你不需要以 2 结束的变量
integer,allocatable::ij_element1(:,:)!,ij_element2(:,:)!//同上
real(8),allocatable::coordinate_n1(:,:)!,coordinate_n2(:,:),stress_1(:,:),stress_2(:,:) !//同上
open(unit=4,file="data.txt")
open(unit=5,file="mdata_new.txt")
!read(4,*)n_node1,n_element1 // 您的数据文件里并没有 n_node1 , n_element1
!read(5,*)n_node2,n_element2 // 同上
n_node1 = 7751 ; n_element1 = 7647 !// 需要赋值
allocate(ij_element1(n_node1,4),coordinate_n1(n_node1,2))!// 删掉了不需要的变量
!读入数据.
do i_node=1,n_node1
    read(4,*)coordinate_n1(i_node,1),coordinate_n1(i_node,2)
end do
do i_element=1,n_element1
    read(4,*)ij_element1(i_element,:)
end do
do i_node=1,n_node1 !// n_node2-> n_node1
    write(5,*)coordinate_n1(i_node,:) !// read 改为 write , coordinate_n2 改为 coordinate_n1
end do
do i_element=1,n_element1 !// n_element2 -> n_element1
    write(5,*)ij_element1(i_element,:) !// read 改为 write , ij_element2 改为 ij_element1
enddo
write(*,*)coordinate_n1(i_node,1),coordinate_n1(i_node,2) !// 4 改为 *
endprogram
其中,第9和第10行,是导致错误的开始。
PS:文件通道号建议10以上,不要用10以下的数字。但为了向你证明不是 Open 语句导致的,所以我没有改动你的文件通道号。

pasuka 发表于 2015-10-31 16:24:53

fcode 发表于 2015-10-31 15:53
对比你前后的两个代码,你并没有解决问题。而是把代码改得更简单,功能更少,以此“回避”了所有问题。

请 ...

文件通道直接上newunit吧,这样省心

fcode 发表于 2015-10-31 17:04:47

pasuka 发表于 2015-10-31 16:24
文件通道直接上newunit吧,这样省心
对。newunit 是个好东西。从刚学fortran我就想这个,因此还自己写过一个 function 叫 GetFreeFileUnit。现在有了 NewUnit ,我就把以前代码里的这个函数都删掉了
Integer Function GetFreeFileUnit()
Logical :: bOpen
Integer :: i
Do i=11,2**20
    Inquire( i , Opened = bOpen )
    IF ( .Not.bOpen ) Exit
End Do
FreeFileUnit = i
End Function GetFreeFileUnit


页: [1] 2
查看完整版本: Fortran文件读入问题