Microsoft KB Archive/112333

= FIX: CTRL+Z Is Not End-of-File Marker in PowerStation =

Article ID: 112333

Article Last Modified on 10/17/2003

-

APPLIES TO


 * Microsoft FORTRAN PowerStation 1.0 Standard Edition
 * Microsoft Fortran PowerStation 1.0a for MS-DOS
 * Microsoft FORTRAN PowerStation 32

-



This article was previously published under Q112333



SYMPTOMS
Run-time error F6101 or F6103 (invalid INTEGER or invalid REAL) may be generated on reading from the last record in a file using Microsoft FORTRAN PowerStation.



CAUSE
The CTRL+Z character is not treated as the true end-of-file marker in MS-DOS or Windows. This character is interpreted as a nonstandard character by FORTRAN PowerStation in many circumstances.



RESOLUTION
To resolve this problem, remove the CTRL+Z character from the end of data files. The function NO_CTRLZ provided below may be used to do this for any file with or without the CTRL+Z character.



STATUS
Microsoft has confirmed this to be a problem in Microsoft FORTRAN PowerStation 32 version 1.0 and 1.0a for MS-DOS and version 1.0 for Windows NT. This problem was corrected in FORTRAN PowerStation 32, version 4.0.



MORE INFORMATION
To demonstrate the problem:

 Build MAKEDATA.FOR and READDATA.FOR (no options are needed). Run MAKEDATA to create a data file ending in a CTRL+Z character. Run READDATA to generate the error:

run-time error F6101: READ(z-test.dat)

- invalid INTEGER

  To fix the data file, build STRIP: FL32 strip.for no_ctrlz.for   Run STRIP (which uses NO_CTRLZ to remove the CTRL+Z): STRIP z-test.dat </li> Run READDATA again (no error will be generated).</li></ol>

Sample Code MAKEDATA.FOR
C Compile options needed: None open(10, file='z-test.dat',form='BINARY') write(10) '1234', char(26) end

Sample Code READDATA.FOR
C Compile options needed: None

open(10,file='z-test.dat') do i=1,20 read(10,*,end=9) k        print *, k      enddo

9 end

Sample Code STRIP.FOR
C Compile options needed: None C To build it use: "FL32 STRIP.FOR NO_CTRLZ.FOR" include 'flib.fi' include 'flib.fd'

character *40 filename integer*2 i

if (NARGS .gt. 1) then call getarg(1, filename, i)       i = no_ctrlz(filename) if (i .ne. 0) then print *, 'Could not open the file: ', filename end if     end if

end

Sample Code NO_CTRLZ.FOR
C Compile options needed: None c    NO_CTRLZ removes the last character in a file if it is CTRL+Z c c    Returns 1 if there are problems, otherwise 0. c

integer function no_ctrlz(filename) character c, filename*(*) logical exist

inquire(file=filename(:len_trim(filename)),EXIST=exist) if (.not. exist) then no_ctrlz = 1 return end if

open(10,file=filename(:len_trim(filename)),access='APPEND',    +  form='BINARY',recl=1)

c    Check if the last character is CTRL+Z backspace(10) read(10) c     if (ichar(c) .ne. 26) then no_ctrlz = 0 !No error, just don't need to do anything return end if

c    Backup, and then rewrite the next to last character to reset c    the true end-of-file marker. backspace(10) backspace(10) read(10) c     backspace(10) write(10) c

close(10)

no_ctrlz = 0 !COMPLETED SUCCESSFULLY

end Additional Reference Words: 1.00 ctrl-z

Keywords: kbbug kbfix kblangfortran KB112333

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.