Как мне TRIM символьный массив в стандартном F77?
Я читаю из файлов данных ASCII с текстовыми заголовками. (Заголовки содержат информацию о прогоне данных.) Я хочу добавить некоторые столбцы каждого файла данных, затем записать результат в другой файл данных, но сохранить заголовки для каждого из файлов. Проблема в том, что я не знаю заранее, какова длина строк заголовка. Если я использую длинную символьную переменную (например, символ *400), чтобы убедиться, что получаю все строки заголовка, то в моих новых файлах данных есть много пустого пространства, которое мне не нужно. По сути, я хочу сделать TRIM(HeaderVariable), но TRIM мне недоступен. Какие-либо предложения? Есть ли способ НАПИСАТЬ только CrLF? Я думал об использовании массива символов *1 и тестировании каждого символа, когда я его читаю и пишу, но... вау, это слишком сложно. Есть ли более простой способ сделать это в стандартном F77? [править: самоотчет перенесен в ответ. не мог сделать это сначала, потому что респ был слишком низким.]
1 ответ
Я получил ответ. Публиковать здесь, чтобы помочь другим. Функция LENGTH, приведенная ниже, взята с http://www.star.le.ac.uk/~cgp/prof77.html Как только вы получите эту функцию LENGTH, легко реализовать собственную функцию TRIM. Функционально это не сильно отличается от моей первоначальной ужасной идеи, но это красивее.
LEN Функция LEN принимает символьный аргумент и возвращает его длину в виде целого числа. Аргумент может быть локальной символьной переменной или элементом массива, но он просто вернет константу. LEN более полезен в процедурах, где фиктивные фиктивные аргументы (и имена символьных функций) могут передаваться по длине из вызывающей единицы, так что длина может отличаться при каждом вызове процедуры. Длина, возвращаемая LEN, соответствует объему, объявленному для элемента. Иногда более полезно найти длину, исключая конечные пробелы. Следующая функция делает это, используя LEN в процессе.
INTEGER FUNCTION LENGTH(STRING) !Returns length of string ignoring trailing blanks
CHARACTER*(*) STRING
DO 15, I = LEN(STRING), 1, -1
IF(STRING(I:I) .NE. ' ') GO TO 20
15 CONTINUE
20 LENGTH = I
END