2011-07-15 2 views
1

Я хотел бы использовать потоковый ввод/вывод FORTRAN для создания программы, которая сообщает мне, сколько строк имеет текстовый файл. Идея заключается в том, чтобы сделать что-то вроде этого:Как проверить EOF/EOL с потоковым I/O в 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» в коде). Когда вы читаете и печатаете символы таким образом, вы в конечном итоге получаете символы новой строки в том же месте, в котором вы были в исходном тексте, поэтому я думаю, что он читает и распознает их как «персонажей». Возможно, превращение символов в целые числа и сравнение с соответствующим числом? Или есть более прямой путь?

(Я знаю, что вы можете использовать чтение регистра (EDIT: я имел в виду чтение записей), чтобы сделать программу, которая легче читает строки и добавить IOstatus для проверки на eof, но «счетчик строк» ​​является просто полезным Например, идея состоит в том, чтобы научиться перемещаться более контролируемым образом через текстовый файл)

ответ

2

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

EDIT: фрагмент кода был изменен на программу для ответа на вопросы в комментариях. Когда «строка» является символьной переменной, когда я тестирую программу с помощью 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 

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

P.S.

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

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

+0

Да, я знаю, что задача, которую я использовал в качестве примера, может быть выполнена так же, как при чтении записей. Тем не менее, есть небольшая вещь, которую я хотел бы указать на ваш код: я не знаю, является ли это только из-за компилятора, компьютера или происходит во всех кодах, но если вы сохраните чтение в переменной «line» ", он просто пропустит пустые строки. Поскольку вы не используете «строку» для чего-либо еще, это можно исправить, если вы просто «читаете», не сохраняя его в любой переменной (таким образом будут подсчитываться все строки). Однако, например, нет способа узнать, где пустые строки в тексте, используя регистр. – Nordico

+0

Я знаю, что это может показаться глупым, но я хотел бы знать способ общения с текстовыми файлами, которые более универсальны/точны, чем чтение записей (я использовал «регистр» в основном вопросе, но я имел в виду запись). Например, поиск слова будет намного проще с потоком, чем с записью (копирование точно одной части текста невозможно, потому что, как я уже сказал, если вы читаете переменную, она пропускает eol). Знаете ли вы о не переносимом способе проверки EOL? Сколько «не переносных»? Очевидно, я предпочел бы портативный, но знание одного несовершенного способа лучше, чем незнание. – Nordico

+0

Как не понять, почему вы считаете, что тест чтения в строки/записи не универсален. Вы беспокоитесь о том, что слова разбиваются по границам строк? В противном случае я не понимаю, почему поиск слова будет намного проще с помощью stream io. –