В вашем примере кажется, что вы хотите, чтобы выходной файл состоял из трех последних столбцов из TEST.DAT, но результат не тот, который вы ожидаете увидеть.
У вас есть два варианта: 1) изменить интервал в TEST.DAT, чтобы он соответствовал операторам формата, или 2) изменить операторы формата, чтобы они соответствовали интервалу в TEST.DAT.
Давайте посмотрим на ваши утверждения формата. Формат 1020 говорит, что необходимо пропустить первые 8 столбцов, прочитать 2 целочисленных типа из следующих 16 столбцов (8 столбцов для каждого типа int), а затем тип символов из следующих 6 столбцов. Например, строка 10 из TEST.DAT читается следующим образом:
TEST.DAT (line 10) with spacing illustrated:
| | | |
123456781234567812345678123456
10 726 1293 1078d
Как видите, значение «726» считывается в IX (10), но «12393107» читается в IY (10), а «8d» читается в NAME (10). Круто, верно, но не то, что вы ожидали! Затем при выводе на печать числа по умолчанию выровнены по правому краю, а по умолчанию выровнены по левому краю, поэтому последние два столбца в RESULTS.DAT печатаются без пробелов между ними:
RESULTS.DAT (line 10) with spacing illustrated:
| | | |
123456781234567812345678123456
726 12931078d
Вот моя рекомендация: измените свой формат чтения, чтобы он был более щадящим и гибким. Просто замените спецификатор 1020
на *
, что означает, что каждый элемент в строке (через запятую или через пробел) образует последовательность, которая будет передана в соответствующую переменную в вашем списке ввода / вывода. Это называется спецификатором формата list-directed
. Обратите внимание, что поскольку номер строки становится частью списка ввода, вам необходимо определить целое число integer dummy_val
(в верхней части подпрограммы), которое затем можно игнорировать. Теперь прочитайте каждую строку, используя:
read(8, *) dummy_val, IX(i), IY(i), NAME(i)
Вы можете сделать то же самое для своей записи: write(9,*), IX(i), IY(i), NAME(i)
, которая будет использовать разумную ширину поля по умолчанию и гарантировать, что между каждым элементом в списке ввода / вывода будет пробел. Если вы хотите больше контролировать форматирование выходных данных, продолжайте использовать оператор форматирования, но измените его так, чтобы между каждым элементом гарантированно было определенное количество пробелов:
write(9, "(4x,I8,I8,1x,A6)") IX(i), IY(i), NAME(i)