Чтение строки из файла с дополнением в Fortran

#fortran

#fortran

Вопрос:

Если у меня есть текстовый файл, в котором строки содержат несколько непустых символов, за которыми следуют пробелы, как мне прочитать эти строки в символьную переменную без лишних пробелов?

 character (len=1000) :: text
open (unit=20,file="foo.txt",action="read")
read (20,"(a)") text
 

будет считывать первые 1000 символов строки в переменный текст, который будет дополнен пробелами в конце, если в строке меньше 1000 символов. Но если длина строки равна 100, у вас есть 900 лишних пробелов, и программа не «знает», какой длины на самом деле была прочитанная строка.

Комментарии:

1. Извините, после вашего редактирования я не совсем понимаю, что вам нужно. Какова ваша цель? Вероятно, вам следует показать какой-нибудь пример. «считывать эти строки в символьную переменную без лишних пробелов» звучит как бессмыслица.

2. Как вы можете прочитать строку и узнать, какова фактическая строка? Содержит ли он 100 символов и разрыв строки или 100 непустых символов, за которыми следуют 900 пробелов, за которыми следует разрыв строки? Если вы читаете в переменную len = 1000 символов, вы не можете сказать.

3. Вы не можете, и мой ответ предлагает какое-то решение. Однако я действительно не понимаю, какое это имеет отношение к «считыванию этих строк в символьную переменную без лишних пробелов». Возможно, вы хотите переписать свой вопрос на что-то более понятное? Возможно, с примерами.

4. Разве вы на самом деле не хотите читать его с этими дополнительными пробелами? Или какие пробелы для вас являются дополнительными, те, что в файле или в переменной? Пожалуйста, будьте ясны.

Ответ №1:

Строки Fortran заполняются пробелами. Просто нет возможности отличить какие-либо значимые пробелы в ваших строках от строк Fortran постоянной длины.

Если важен каждый пробел, я предлагаю вместо этого обрабатывать файл как файл с доступом к потоку (форматированный или неформатированный по мере необходимости), считывать отдельные символы в некоторый буфер массива и выделять строку отложенной длины только после того, как вы знаете, какая длина вам действительно нужна.

Ответ №2:

 character (len=1000) :: text
integer :: s, ios

open (unit=20,file="foo.txt",action="read")
read (20,"(a)", size=s, advance='no', iostat=ios) text
 

После этой последней строки s содержится количество прочитанных символов, включая конечные пробелы, что, я думаю, является тем, что вы хотели.

Примечания:

Для size тега у вас также должен advance быть установлен тег, в 'no' противном случае вы получите ошибку компиляции. Поскольку формат есть "(a)" , считывается вся строка, поэтому следующий read оператор перейдет к следующей строке, несмотря на 'no' . Это нормально.

ios сохраняет отрицательное целое число при попытке чтения после конца строки. Это всегда будет происходить, если строка короче длины text . Это нормально. При попытке чтения после конца файла ios будет сохранено другое отрицательное целое число. Я думаю, что эти два отрицательных целых числа не заданы стандартом, поэтому вам, возможно, придется немного поэкспериментировать. В моем случае, с компилятором gfortran, ios было равно -1 при попытке чтения после конца файла и -2 в противном случае.

Комментарии:

1. В нем есть стандартные именованные константы iso_fortran_env .