Это мой файл данных 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