2016-03-24 80 views
1

我了解使用iostat,当我们从终端输入时如何使状态为io<0,以便程序理解输入的结束已达到?iostat和从终端输入

例如,在一个简单的代码来找到平均值:

program mean 
implicit none 
real :: x 
real :: gmean, amean, hmean 
real :: summ,pro,invsum 
integer :: i, valid 
integer :: io, countt 

countt=0 
valid=0 
summ=0 
pro=1 
invsum=0 

do 
    read(*,*,iostat=io) x 
    if (io<0) exit 
    countt=countt+1 
    if (io>0) then 
     write(*,*) 'error in input..try again !!!' 
    else 
     write(*,*) 'Input data #.',countt,':',x 
     if (x<=0) then 
      write(*,*) 'input <=0..ignored !!' 
     else 
      valid = valid + 1 
      summ = summ + x 
      pro = pro*x 
      invsum = invsum + (1.0/x) 
     end if 
    end if 
end do 
if (valid>0) then 
    amean=summ/valid 
    gmean = pro**(1.0/valid) 
    hmean=valid/invsum 

    write(*,*) 'number of valid items --->',valid 
    write(*,*) 'arithmetic mean --> ',amean 
    write(*,*) 'geometric mean --> ',gmean 
    write(*,*) 'harmonic mean --> ',hmean 
else 
    write(*,*) 'no valid inputs !!' 
end if 
end program mean 

当我执行的代码,一切工作正常,除了它不断要求输入。我不明白如何使io<0

回答

1

在Unix系统,例如Linux和MAC OS,则可以使用Ctrl键 - d以发信号通知文件的末尾。

在Windows上,使用按Ctrl - ž(从here)。

Wikipedia article比较各种操作系统上的进一步命令行快捷方式。

+0

喔感谢名单....但如果输入是一个文件,它是如何工作的? – ss1729

+1

@ ss1729只需提供每行输入。文件结束信号是信号,在文件结尾处:) –

1

我想是不错的用户(即使它只是我..)

character*80 input 
real val 
integer stat 
input='' 
do while(input.ne.'e') 
write(*,'(a)',advance='no')'enter val [e to end]: ' 
read(*,'(a)',iostat=stat)input !iostat here to catch ^d and such 
if(stat.ne.0)input='e' 
if(input.ne.'e')then 
    read(input,*,iostat=stat)val !check iostat here 
           !in case user entered some 
    if(stat.ne.0)then    !other non-number 
    write(*,*)val 
    else 
    write(*,*)'expected a number' 
    endif 
endif 
enddo 
end