Может ли вход в оператор FORTRAN 'READ' быть взят из строкового литерала? - PullRequest
1 голос
/ 03 февраля 2011

Для разработки некоторых тестов было бы полезно, если бы я мог вводить оператор FORTRAN READ, используя строковый литерал в источнике, а не во внешнем файле или в stdin. В Python есть модуль StringIO, который можно использовать для создания файлового объекта из строкового литерала. Возможно ли нечто подобное в FORTRAN?

т.е.

      MAKEFAKEDEVICE(N, 'Some string literal here')
      READ(N, '(A)'), VAR1

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

Вы можете использовать внутреннее чтение или запись (то есть IO из / в переменные типа CHARACTER и файлы для обычного IO):

!Demonstrate internal read/write                                                                                             
program intio                                                                                                                
  implicit none                                                                                                              
  character(len=20) :: a, b                                                                                                  
  a = "hello world!"                                                                                                         
  ! Read a into b with A format                                                                                              
  read(a, '(A)') b                                                                                                           
  print *, b  ! Should print "hello world!"                                                                                  
  ! Now write into b                                                                                                         
  write(b, *) "I said hello!"                                                                                                
  print *, b                                                                                                                 
  ! Read into b from literal                                                                                                 
  !read("Well, hello!", '(A)') b                                                                                             
  !print *, b                                                                                                                
end program intio                                                                                                            

Если раскомментировать последние две строки, вы получите

intread.f90:13.7:

  read("Well, hello!", '(A)') b
       1
Error: UNIT specification at (1) must be an INTEGER expression or a CHARACTER variable

Так что нет, вы не можете читать по буквам.

0 голосов
/ 03 февраля 2011

Я действительно не знаю (и мне еще рано думать :), если это поможет, но вы можете попробовать поискать в своей справке "внутреннее чтение".

Я не знаю ни одного способа прочитать часть источника, но обычная строка может быть прочитана чем-то вроде

string = 'some literal'  
read(va1, (a))string  

http://www.megasolutions.net/fortran/internal-read-of-character-array_F-ifort-differences-77847.aspx

0 голосов
/ 03 февраля 2011

Я только что посмотрел на тесты, используемые проектом GCC, и кажется, что следующее действительно,

      OPEN(10, STATUS='scratch')
      WRITE(10, '(A)'), 'Some literal'
      REWIND(10)
      READ(10, '(A)') VAR1
...