Как правильно читать целые числа в fortran90, когда во входном файле есть как целое число, так и текст? - PullRequest
0 голосов
/ 29 января 2020

Это мой файл данных a.txt

01 12  00 10  Nothing to do

Для ясности позвольте мне пометить пробелы * 01*12**00*10**Nothing*to*do.

Я пытаюсь прочитать его с помощью fortran90 код

implicit none
integer           :: a,b,c,d
character(len=16) :: ch

print*,"Case1"
open(unit=10,file="a.txt", form="formatted")
read(10,*)a,b,c,d,ch
write(*,"(4(i2.2,1x),a16)")a,b,c,d,ch
close(10)

print*,"Case2"
open(unit=10,file="a.txt", form="formatted")
read(10,"(4i2,a16)")a,b,c,d,ch
write(*,"(4(i2.2,1x),a16)")a,b,c,d,ch
close(10)

print*,"Case3"
open(unit=10,file="a.txt", form="formatted")
read(10,"(4(i2,1x),a16)")a,b,c,d,ch
write(*,"(4(i2.2,1x),a16)")a,b,c,d,ch
close(10)

end

И это вывод

 Case1
01 12 00 10 Nothing         
 Case2
01 01 02 00 0 10  Nothing to
 Case3
01 12 00 01   Nothing to do 

Как видите, целые числа читаются правильно, когда я не указываю тип данных (Case1), но символ не читается правильно. Когда я указываю их как целое число (Case2), ведущий 0 игнорируется, и считается, что каждый di git дает неправильную строку. Когда я также указываю пробел как 1x (Case3), первые два целых числа читаются правильно, но оно не может подобрать третье, так как есть два пробела. Поскольку не всегда возможно узнать все пробелы в данном файле, этот метод также не будет очень практичным.

Как правильно прочитать эти данные?

Я получил такой же результат с gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC), gcc version 8.2.0 (GCC) и ifort version 19.0.3.199.

Edit

Если вход содержит только целые числа, можно использовать методы, описанные в Чтение последовательности целых чисел в строке с неизвестной границей в fortran

implicit none
integer           :: nums(4)
character(len=30) :: ch, ch1

open(unit=10,file="a.txt", form="formatted")
read(10,"(a)")ch
read(ch,*) nums,ch1

write(*,"(a)")ch
write(*,"(4(i2.2,1x),a16)")nums,ch1

close(10)
end

И мы возвращаемся к Case1.

01 12  00 10  Nothing to do   
01 12 00 10 Nothing 
...