Как проверить EOF / EOL с потоковым вводом / выводом в Фортране? - PullRequest
1 голос
/ 16 июля 2011

Я хотел бы использовать потоковый ввод / вывод FORTRAN для создания программы, которая сообщает мне, сколько строк имеет текстовый файл. Идея состоит в том, чтобы сделать что-то вроде этого:

OPEN(UNIT=10,ACCESS='STREAM',FILE='testfile.txt')

nLines=0
bContinue=.TRUE.

DO WHILE (bContinue)
   READ(UNIT=10) cCharacter
   IF (cCharacter.EQ.{EOL-char}) nLines=nLines+1
   IF (cCharacter.EQ.{EOF-char}) bContinue=.FALSE.
ENDDO

(я не включал объявление переменных, но, думаю, вы поняли, что они собой представляют; единственное важное уточнение будет то, что cCharacter имеет LEN = 1)

Моя проблема в том, что я не знаю, как проверить, является ли символ, который я только что прочитал из файла, концом строки или концом файла («ifs» в коде). Когда вы читаете и печатаете символы таким образом, вы в конечном итоге получаете новые строки в том же месте, в котором они были в исходном тексте, так что я думаю, что они как-то читают и распознают их как «символы». Возможно, превращение символов в целые числа и сравнение с соответствующим числом? Или есть более прямой путь?

(я знаю, что вы можете использовать чтение регистров (РЕДАКТИРОВАТЬ: я имел в виду чтение записей), чтобы сделать программу, которая легче читает строки, и добавить IOstatus для проверки на eof, но «счетчик строк» ​​является лишь полезным примером идея состоит в том, чтобы научиться перемещаться по текстовому файлу более контролируемым образом)

1 Ответ

2 голосов
/ 16 июля 2011

Проверка на наличие определенного символа в качестве ограничителя строки делает вашу программу зависимой от ОС. Было бы лучше использовать возможности языка, чтобы ваша программа зависела от компилятора и ОС. Поскольку строки в основном являются записями, зачем делать это с помощью ввода-вывода steam? Этот запрос, кажется, превращает легкую работу в тяжелую. Если вы можете использовать обычный ввод-вывод, вот пример программы для подсчета строк в текстовом файле.

РЕДАКТИРОВАТЬ: фрагмент кода был изменен в программу, чтобы ответить на вопросы в комментариях. С «строкой» в качестве символьной переменной, когда я тестирую программу с помощью gfortran и ifort, я не вижу проблемы, когда во входном файле есть пустые или пустые строки.

program test_lc

use, intrinsic :: iso_fortran_env

integer :: LineCount, Read_Code
character (len=200) :: line


open (unit=51, file="temp.txt", status="old", access='sequential', form='formatted', action='read' )

LineCount = 0

ReadLoop: do

   read (51, '(A)', iostat=Read_Code)  line

   if ( Read_Code /= 0 ) then
      if ( Read_Code == iostat_end ) then
         exit ReadLoop    ! end of file --> line count found
      else
         write ( *, '( / "read error: ", I0 )' )  Read_Code
         stop
      end if
   end if

   LineCount = LineCount + 1

   write (*, '( I0, ": ''", A, "''" )' )  LineCount, trim (line)
   if ( len_trim (line) == 0 ) write (*, '("The above is an empty or all blank line.")' )

end do ReadLoop

write (*, *) "found", LineCount, " lines"

end program test_lc

Если вы хотите продолжить обработку файла, вы можете перемотать его.

приписка

Основная причина, по которой я использовал Fortran Stream IO, - это чтение файлов, созданных на других языках, например, C

Предоставляются переносимые методы для написания границ новой строки; Я не знаю о переносном методе для проверки такого.

...