Fortran прочитать строку из файла
Перед выполнением операций с файлом он должен быть присоединен (связан) с логическим устройством. Иными словами файл должен быть открыт. Этот оператор открывает файл и файловый указатель устанавливается на первую запись.
OPEN([unit=]<номер устройства>,
[,accsess=<способ доступа>]
[,form=<способ представления данных>]
[,err=<метка>]
[,file=<имя файла>]
[,iostat=<целочисленная переменная>]
[,recl=<целочисленное выражение>]
[,status=<символьное выражение>])
Спецификаторы могут указываться в любом порядке. Если unit стоит первым, то можно указать только номер, опустив unit. Способ доступа может принимать значения: access =’ sequential’ - последовательный доступ, access = ‘direct’ - прямой доступ access =’ append’ – применяется для работы с файлами последовательного доступа, открытыми для добавления. Form='formatted’ или ‘unformatted’ определяет способ представления данных.
Если метод доступа не указан, то файл по умолчанию считается последовательного доступа форматным.
При прямом методе доступа по умолчанию файл считается неформатным.
Open (20, file = ‘text.dat’) – файл форматный последовательного доступа.
Open (30, file = ‘text1.dat’, accsess = ‘direct’, recl = 4, status = ‘old’) – файл прямого доступа несформатный, уже имеющийся, длина записи=4.
file – имя файла (спецификация файла), которое может быть задано символьной константой или введено с клавиатуры в символьную переменную. Если этот параметр опущен, то внешний файл рассматривается как временный и имя этот файл получает по умолчанию.
Iostat – целочисленная переменная, которая = 0, если ошибки нет, и имеет положительное значение, если во время выполнения данного оператора произошла ошибка, и отрицательное число в случае, если возникла ошибка.
err – метка оператора, которому передается управление, если во время выполнения оператора произошла ошибка.
Recl – используется только для файлов прямого доступа (указывается размер записи в байтах).
Status – указывает состояние: новый (new), существующий (old), временный (scratch), сохранять (keep или save), удалить (delete).
Для файлов временных файлов всегда действует статус delete, а для остальных save (после закрытия файла, он сохраняется).
При создании файла указывают Status =’ new’, хотя по умолчанию, если файла нет, он открывается с этим значением.
Все операторы ввода/вывода, кроме операторов ввода/вывода со стандартных системных устройств (*, 5, 6) могут содержать управляющую информацию, представляющую собой список спецификаторов.
Оператор Read
Этот оператор используется для чтения данных из файла, подсоединенного к устройству unit=<номер устройства> в указанные в списке ввода переменные. Общий вид оператора:
Read ( [unit=]<номер устройства>,
[,fmt=<способ представления данных>]
[,end=<метка>]
[,err=<метка>]
[,iostat=<целочисленная переменная>]
[,rec=<целочисленное выражение>] ) <список ввода>
Спецификаторы unit=<номер устройства>, file=<имя файла> были рассмотрены ранее.
Fmt – спецификатор формата, который может быть задан, либо меткой формата, либо символьным выражением, определяющим формат. Если вместо формата стоит *, то это означает ввод под управлением списка (только для текстовых файлов последовательного доступа). Этот спецификатор указывается только для форматных записей. Для неформатых файлов этот спецификатор должен быть опущен.
End – метка оператора, которому передается управление при достижении записи «конец файла».
Err - метка оператора, которому передается управление, если произошла ошибка ввода/вывода.
Iostat – целочисленная переменная, которая = 0, если ошибки нет, и имеет положительное значение, если во время выполнения данного оператора произошла ошибка, и отрицательное число в случае, если возникла ситуация коней файла.
Rec – целочисленное выражение, используется только для файлов прямого доступа и определяет номер считываемой записи.
Read(20, *) x- считывает в свободном формате (под управлением списка) данное из файла, который связан по каналу 20, в переменную x.
В предыдущих пунктах, посвященных вводу/выводу данных, рассматривалось взаимодействие со стандартными устройствами: клавиатурой и монитором. Также упоминалось, что доступные компьютеру устройства пронумерованы, и обращение к ним осуществляется через их номера. Так, номер стандартного устройства ввода – клавиатуры, обычно «5», а номер стандартного устройства вывода – экрана монитора, обычно «6». Но поскольку эти устройства используются по умолчанию, для них предусмотрено единое обозначение – символ «звездочка».
Если быть точнее, то внешние устройства и их номера в Фортране, всегда относятся к файлам – т.е. программа считывает данные и записывает их в файлы, связанные с устройствами. Например, в UNIX, стандартное устройство «5» ассоциируется с файлом потока стандартного ввода stdin, а стандартное устройство за номером «6» – с файлом потока стандартного ввода stdout. Не зарезервированные номера устройств (а это практически все множество буквальных целых констант) по умолчанию связаны с жестким диском компьютера – т.е. эти номера можно ассоциировать с файлами жесткого диска – обычно для этого хватает первых четырех номеров от «1» до «4».
Пример 6.12. Открытие, запись, чтение и закрытие файлов.
Ассоциирование файла с номером устройства важный технологический момент, предшествующий чтению или записи данных. Сначала внешний файл связывается с номером устройства и открывается оператором OPEN, затем производится чтение или запись данных операторами READ или WRITE. После необходимых операций чтения и записи файл закрывается оператором CLOSE, с освобождением номера устройства и освобожденный номер можно использовать для дальнейших файловых операций (Пример 6.12).
В результате работы этой программы в текущей директории появится файл «info.txt» – обычный текстовый файл. Однако использованные умолчания требуют детальных разъяснений.
Оператор OPEN в развернутом виде содержит весьма значительный перечень спецификаторов. Наиболее часто применяемыми из них являются:
- Номер устройства: спецификатор UNIT
- Имя файла: спецификатор FILE;
- Статус файла: спецификатор STATUS;
- Способ доступа к данным: спецификатор ACCESS;
- Длина записи: спецификатор RECL;
- Представление данных: спецификатор FORM;
- Статус ввода/вывода: спецификатор IOSTAT.
Спецификатор UNIT является обязательным: например, UNIT=1 в рассмотренном примере. При этом достаточно указать только номер, в данном случае это «1». Можно использовать любые номера, кроме «5» и «6», зарезервированных под стандартные устройства или иных зарезервированных, если таковые имеются.
Спецификатор FILE – это текстовое выражение, переменная или константа содержащая имя файла в формате, предусмотренном операционной системой – в рассмотренном примере это файл в текущей директории: FILE = «INFO.TXT».
Спецификатор STATUS – статус файла с именем, определенным в спецификации FILE – определяется как скалярной текстовой величина с одним из пяти перечисленных значений:
- «OLD» – открывается уже существующий файл.
- «NEW» – создается новый, еще несуществующий файл.
- «REPLACE» – если файл не существует, то он будет создан, а существующий файл, будет удален и создан новый файл с тем же именем.
«SCRATCH» – создается временный файл, который удаляется после закрытия. Для SCRATCH-файла спецификатор FILE не имеет смысла и не используется.
«UNKNOWN» –для существующего файла устанавливает статус «OLD», а для несуществующего – статус «NEW». «UNKNOWN» назначается по умолчанию, если спецификатор STATUS явно не прописан в операторе OPEN (Пример 6.12).
Когда статус файла явно не задан, то при компиляции программы иногда выдается соответствующее предупреждение (warning), которое начинающие программисты часто принимают за ошибку.
Спецификатор ACCESS – способ доступа к данным определяется скалярным текстовым выражением, принимающим одно из двух значений: «SEQUENTIAL» (файл последовательного доступа) или «DIRECT» (файл прямого доступа). Файлы прямого доступа состоят из записей одинаковой длины, и к произвольной записи файла можно обратиться по ее номеру. Файлы последовательного доступа могут состоять из записей произвольной длины, а от текущей записи можно перейти только к следующей или предыдущей. Если способ доступа к данным явно не указан (Пример 6.12), то считается что это файл последовательного доступа.
Спецификатор RECL – длина одной записи файла (в байтах или машинных словах) актуальна только для файлов прямого доступа.
Спецификатор FORM – задается скалярным текстовым выражением и определяет форму представления данных: «FORMATTED», соответствующее форматному представлению данных или «UNFORMATTED» – соответствующее бесформатному представлению данных. Если форма представления не указана, то файл последовательного доступа считается форматным (Пример 6.12), а файл прямого доступа бесформатным. Форматный (по сути текстовый) файл содержит данные в удобочитаемом для человека виде. Эти данные могут считываться и записываться с использованием спецификаций формата. Бесформатный файл не предполагает визуального прочтения и хранит данные во внутреннем машинном представлении.
Спецификатор IOSTAT – характеризует состояние ввода/вывода и задается как любая целая скалярная переменная, например IOSTAT= IOS, при этом IOS = 0 означает успешную операцию ввода/вывода, а любое другое значение констатирует ошибку.
Для предъявления оператора OPEN в развернутом виде целесообразно разделить Пример 6.12 на две части (Примеры 6.13 и 6.14).
Пример 6.13. Оператор OPEN в развернутом виде.
Если при запуске программы (Пример 6.13) в текущей директории присутствует файл «INFO.TXT» с явно указанным для него статусом «NEW» в операторе OPEN, то программа завершится по ошибке: «IOS > 0». Файл «INFO.TXT» является результатом работы программы и должен появиться после ее запуска.
Пример 6.14. Открытие, запись, чтение и закрытие файлов.
Для корректной работы программы (Пример 6.14) требуется наличие в текущей директории файла «INFO.TXT» – результата работы предыдущего примера. Если такого файла не окажется, то программа завершится с ошибкой: «IOS > 0», поскольку для файла данных «INFO.TXT» явно указан статус «OLD» в операторе OPEN.
В операторах READ и WRITE при работе с текстовыми файлами могут использоваться все дескрипторы формата ввода/вывода данных (п.6.3). Однако, помимо номера устройства и спецификации формата, операторы READ и WRITE могут содержать и другие спецификаторы – например спецификатор IOSTAT в точности такой же, как для оператора OPEN.
Наличие спецификатора IOSTAT в операторах READ и WRITE позволяет программисту самостоятельно обрабатывать ошибки чтения и записи в штатном режиме, без прерывания работы программы. Это может быть весьма актуально при обработке текстовых файлов с заранее неизвестным количеством текстовых строк, например, при копировании одного файла в другой (Примере 6.15).
Для работы этого примера в текстовом редакторе потребуется подготовить небольшой текстовый файл с именем «FILE1.TXT», в котором не менее трех строк, каждая не длиннее 80-ти символов. На выходе программа создаст копию файла «FILE1.TXT» в файле с именем «FILE2.TXT».
Пример 6.15. Копирование файлов.
При открытии существующего текстового файла оператором OPEN, текущая позиция чтения находится перед первой записью файла. Чтение первой записи перемещает позицию к следующей записи и т.д. При открытии нового файла и записи последовательно добавляются в конец файла – где постоянно находится позиция для записи. В связи с этим ля файлов последовательного доступа представляет интерес позиционирование внутри файла.
При помощи оператора BACKSPACE можно из любой позиции файла перейти к предыдущей (или только что прочитанной) записи файла, а при помощи оператора REWIND – перейти к началу файла. В качестве параметра оба оператора используют номер ассоциированного с файлом устройства, например «BACKSPACE 1» или «REWIND 4». Если файл уже позиционирован в начало, то применение этих операторов не повлечет за собой ошибки или изменения в позиционировании. Проиллюстрировать возможности позиционирования можно на своеобразном «плеере» файла с элементами «перемотки» записей (Пример 6.16). Для работы программы потребуется текстовый файл с именем «FILE1.TXT», с несколькими строками, не длиннее 80-ти символов.
Пример 6.15. «Перемотка записей» текстового файла.
В заключение, стоит отметить, что в любой позиции файла, используя оператор ENDFILE, можно внести запись «Конец файла», при этом все последующие строки файла будут утеряны. В качестве параметра оператору ENDFILE указывается номер устройства, так же как для BACKSPACE и REWIND.
Описание программирования ввода/вывода прямого доступа (ACCESS = «DIRECT») и бесформатной формой представления данных (FORM = «UNFORMATTED») выходит за рамки данного учебного пособия.
Fortran: cчитать конкретые записи из текстового файла
Fortran: cчитать конкретые записи из текстового файлаЯ в фортране только начинаю, и у меня возник (вероятно глупый) вопрос по поводу чтения из текстового файла.
Пусть в текстовом файле inp.txt записи типа такого
x(i) = (0.55 4.33 3.11)
Я знаю как считать все поля последовательно
или как сделать из них двумерный массив. А как сделать так, чтобы в массив считывался только 2-ой столбец?
Буду очень признателен за помощь.
Если Вы заранее знаете число строк n и число столбцов m, то можно, например так:end program readArray
Спасибо, на таком модельном массиве хорошо работает. А Вы не знаете, что делать, если в файле помимо чисел имеются символы? В этом случае такая программа выдает ошибку (потому что массив из действительных чисел). Т.е. проблема в том, что сначала в массив считывается весь файл, а потом идет работа с массивом. А вот конкретную строчку или столбец можно считать? Ну как в матлабе, например.
Последний раз редактировалось Evgeny_2012 26.02.2012, 10:39, всего редактировалось 2 раз(а).
По поводу считать конкретную строку/столбец: нет, нельзя.
А как вы это делаете в матлабе? Если не секрет?
В принципе, можно поступить так:
Если ваш файл содержит строки
e 13.4 asd
e 25.7 6fr
e 56.24 ddd
то читаем второй столбец:
character(5) chBuf1,chBuf2
double precision a(3)
open (1,file = 'data.dat')
do i = 1,3
read(1,*) chBuf1,a(i),chBuf2
end do
close(1)
print *,a
end
Будет читать начиная с 15-го символа в строчке.
Если чётко в определённом месте строчки столбец. Иначе -- надо читать в строчку и потом её парсить. Лучше это делать не на фортране. Если необходимо рассмотреть чтение в общем случае, то можно считывать строку, разбивать ее на слова, скажем по пробелам, и выбирать нужный столбец. Подобный пример кода для анализа строки, если мне не изменяет память, приведен в книге О.Бартеньева "Современный Фортран".
Другое дело, что на Фортране это делать не очень удобно. Если автор топика не ограничен в выборе языка и обладает некоторым (весьма небольшим) количеством времени, то я бы порекомендовал Питон. Вот тут это делается элементарно. В добавок ко всему это свободный продукт.
Последний раз редактировалось TupaHo3aBp 26.02.2012, 22:14, всего редактировалось 1 раз.
MottleСпасибо, на таком модельном массиве хорошо работает. А Вы не знаете, что делать, если в файле помимо чисел имеются символы? В этом случае такая программа выдает ошибку (потому что массив из действительных чисел).
Уточните хотя бы структуру файла. Лично у меня есть подозрения, что такой файл в Вашем случае формируется прибором и имеет некоторый заголовок, после которого идут численные данные. Например:
Эксперимент от 32 февраля 2011 года.
Тип эксперимента: Определение предела растяжимости резинки от трусов
Данные:
относительное удлинение - модуль упругости - абсолютное удлинение
0.12 0.55 1.23
1.56 4.33 1.63
9.24 3.11 7.09
.
То есть у Вас есть n cтрочек заголовка, а дальше m строчек c данными. Соответственно, объявляем довольно обширную строковую переменную, и запихиваем в нее всю читаемую строку. Поскольку разбираться с заголовком мы точно не будем, то каждый раз при чтении мы будем все читать в одну и ту же переменную. Пусть данные перезаписываются, нам не жалко.
Еще момент: в ту же строковую переменную имеем полное право читать и строчки с данными, если они вдруг нам не нужны. Опять же, данные эти мы разбирать не будем, они просто теряются.
А в читаемых правильно (как числа) данных мы выбираем только второй столбец. Mottle предложил для этого абсолютно корректное решение, которое, кроме того, в две секунды видоизменяется на тот случай, когда надо выбрать, скажем, только третью колонку. Но можно поступить варварски и опять же читать все ненужные числа в некие буферные переменные, данные из которых никак не обрабатывать - они перезапишутся и потеряются. Ну и из лентяйства примем, что в каждой строке данных, принимаемых на ввод, ровно 3 числа . Как в поставленной задаче. Такой ленивый вариант тоже может быть переделан на другой столбец или другое число данных в строке, но потребуется уже не 2 секунды. Ну, секунд 10, наверно. Так что право на жизнь имеет!
Дополнительно: предполагается, что числа n и m (сколько строк пропускаем и сколько обрабатываем) вводятся с клавиатуры. Пояснения к вводу будут выведены транслитом . Почему? Русский шрифт в консольном окне должен быть в DOS-кодировке, не разбирающиеся в нюансах люди могут и редактора подходящего для этого не найти. Блокнот из Windows не подходит! В принципе, эти же два числа можно приписать впереди начала файла и обойтись без консоли, надо только программу соответствующим образом переписать.
program readcolumn
implicit none
! Начинаем наши грязные делишки!
Разве то, что вы написали не выводит все содержимое файла?
где-то я встречал код как это сделать. Давно ничего не делал на фортране. Поищите. Это можно сделать.
По ссылке есть примеры кода (законченные программы на случай если ты законченный фортранщик). Копипасть. Изменяй. Смотри на результат.
Вы решаете какие-то конкретные технические задачи ни фортране или просто сами его изучаете из любопытства?
не знаю сейчас проверю ,я вчера всё перепробовал ,всегда ошибки были ,это я сегодня с утра сам придумал .
можно, можно это сделать. Я посмотрю еще.
Полезно. Есть книга Бартенева. Там подробно описан этот язык. Давно изучал его.
да книга Бартенева есть ,но в гугле те места книги которые попадались в них не было самого простого то что мне нужно а без понимания этого я не вижу смысла впитывать остальное.
скачал там 450 страниц 10 главу сйчас посмотрю ,кстате сразу бросается в глаза что в фортране опреатор приглашения ввода с клавиатуры не INPUT а READ ,это в мозгу приводит к путанице read это же читать .
да. У меня тоже пока не получилось. Задача простая. Дано не работал с фортраном.
10 главу посмотрите. Должно заработать.
читал я это страницу но пока не понял то что для меня нужно .
Что у тебя с запятыми?
ты изучаешь язык программирования и пытаешься угадывать его синтаксис? методика крайне интересная, держи нас в курсе.
Стало интересно, нафига отбивать пробелом запятую до, а не после.
!f95 -o file file.f95
open(12,FILE='home/alex/info.txt') write(12,*) close(12) end
вывел ascii. Что-то не так?! Гляну еще.
Я хочу изучить яп, но не хочу учить яп. Пойду на форуме какую-нибудь ерунду напишу.
У тебя же гента стоит, судя по предыдущим постам, да?
никак ты не угадаешь это надо просто знать из какого-нибудь источника
так я и учу его потихоньку ,вот столкнулся с непониманием ,гуглёж ничего не дал ,поэтому спросил.
может ты знаешь как надо выводить на экран текст из файла на фортране ?
я твой код попробовал но с командой write ,программа стирает всё содержимое файла info.txt
нет не стоит у меня гента ,а при чём тут гента
у меня может стоять что угодно если это как то поможет ))
no-such-file ★★★★★ ( 27.07.17 22:40:39 )там описаны всякие замудрёные действия а вот просто напечатать страницу текста
Последнее исправление: no-such-file 27.07.17 22:41:03 (всего исправлений: 1)
ты тоже не знаешь как это сделать
в linuxe делал. Возможно библиотека отсутствует в фортране. Позже еще попробую. Работы много.
ладно не парься ,это не столь важно ,может кто напишет если помнит точно
Ты не подходишь для программирования. Вообще.
Поставь Compaq Visual Fortran 6.6.0 для винды. Отработаешь книгу по Бартеньеву и язык выучишь. Там возможно и есть код, что выводит, может библиотеки есть еще какие. Вообще фортран для технических расчетов создан, в софке вся авиа промышленность была написана на фортране. Сейчас тоже используется, но не так широко как раньше. Интересный язык.
кстати, чуть не забыл. Там можно импортировать код написанный на с. Когда то делал это. Нужно описать в интерфейсе на фортране функцию сишную, и откомпилить с программу в объекный файл. Потом сбрать все фортрановским компилятором и объектные файлы фортрана и с. Точка входа у фортрановской программы. Вызов параметров и функций у фортрана и с по-разному в стэк укладывают по каждый по своему параметры, это надо учитывать. Делал это в винде. Тебе удачи. Изучай.
Книжка Бартеньева старье. Например, уже давно можно не выдумывать номера для файлов, а писать так
Читайте также: