Fortran прочитать строку из файла
В предыдущих пунктах, посвященных вводу/выводу данных, рассматривалось взаимодействие со стандартными устройствами: клавиатурой и монитором. Также упоминалось, что доступные компьютеру устройства пронумерованы, и обращение к ним осуществляется через их номера. Так, номер стандартного устройства ввода – клавиатуры, обычно «5», а номер стандартного устройства вывода – экрана монитора, обычно «6». Но поскольку эти устройства используются по умолчанию, для них предусмотрено единое обозначение – символ «звездочка».
Если быть точнее, то внешние устройства и их номера в Фортране, всегда относятся к файлам – т.е. программа считывает данные и записывает их в файлы, связанные с устройствами. Например, в UNIX, стандартное устройство «5» ассоциируется с файлом потока стандартного ввода stdin, а стандартное устройство за номером «6» – с файлом потока стандартного ввода stdout. Не зарезервированные номера устройств (а это практически все множество буквальных целых констант) по умолчанию связаны с жестким диском компьютера – т.е. эти номера можно ассоциировать с файлами жесткого диска – обычно для этого хватает первых четырех номеров от «1» до «4».
Fortran: cчитать конкретые записи из текстового файла
Я в фортране только начинаю, и у меня возник (вероятно глупый) вопрос по поводу чтения из текстового файла.
Пусть в текстовом файле inp.txt записи типа такого
А я хочу считать второй столбец в массив x(i). То есть так, чтобы у меня было
x(i) = (0.55 4.33 3.11)
Я знаю как считать все поля последовательно
open ( 2 , file = 'inp.txt' , status = 'old' , iostat = ios )
read ( 2 , * , iostat = ios ) ( x ( i ) , i = 1 , N )
или как сделать из них двумерный массив. А как сделать так, чтобы в массив считывался только 2-ой столбец?
Буду очень признателен за помощь.
integer i,j,n,m,curColumn
real , allocatable :: A ( : , : ) ,x ( : )
allocate ( A ( n,m ) ,x ( m ) )
open ( 10 , file = 'inp.txt' )
do i = 1 ,n
read ( 10 , * ) ( A ( i,j ) ,j = 1 ,m )
enddo
close(10)
curColumn=2
x = A ( : ,curColumn )
write ( * , "(f6.2,1x)" ) x
end program readArray
Mottle
Спасибо, на таком модельном массиве хорошо работает. А Вы не знаете, что делать, если в файле помимо чисел имеются символы? В этом случае такая программа выдает ошибку (потому что массив из действительных чисел). Т.е. проблема в том, что сначала в массив считывается весь файл, а потом идет работа с массивом. А вот конкретную строчку или столбец можно считать? Ну как в матлабе, например.
Последний раз редактировалось 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
integer :: j , m, n, ios
real , allocatable :: x ( : )
real :: d1 , d2 ! dummy variables
character ( len = 255 ) :: stroka ! dummy string variable
write ( * , * ) 'Vvedite chislo strok zagolovka'
read ( * , * ) n
write ( * , * ) 'Vvedite chislo chitaemyh strok'
read ( * , * ) m
allocate ( x ( m ) )
open ( 11 , file = 'inp.txt' , status = 'old' , iostat = ios ) ! номерок 2 зарезервирован! Я взял 11 :)
! Начинаем наши грязные делишки!
do j = 1 ,m + n ! реально читаем заголовок + m нужных строк
if ( j. le . n ) then
read ( 11 , * ) stroka
else
read ( 11 , * ) d1, x ( j - n ) , d2
end if
end do
.
! Тут как-то выводим получившийся массив. Можно, как предложил Mottle:
write ( * , "(f6.2,1x)" ) x ! кстати, оператор должен работать, хоть и сидит весь среди комментариев!
.
deallocate ( x ) !освобождаем память
close ( 11 )
То есть у Вас есть n cтрочек заголовка, а дальше m строчек c данными. Соответственно, объявляем довольно обширную строковую переменную, и запихиваем в нее всю читаемую строку. Поскольку разбираться с заголовком мы точно не будем, то каждый раз при чтении мы будем все читать в одну и ту же переменную. Пусть данные перезаписываются, нам не жалко.
Имелось в виду, что в эту строковую переменную читается заголовок . Хотя, по предлагаемой программе это ясно.
По поводу считать конкретную строку/столбец: нет, нельзя.
А как вы это делаете в матлабе? Если не секрет?
В принципе, можно поступить так:
Если ваш файл содержит строки
e 13.4 asd
e 25.7 6fr
e 56.24 ddd
то читаем второй столбец
Уточните хотя бы структуру файла. Лично у меня есть подозрения, что такой файл в Вашем случае формируется прибором и имеет некоторый заголовок, после которого идут численные данные.
Да, извините. Я как-то не подумал. На самом деле у меня на данный момент структура файла как сказал Evgeny_2012 . Но ваша конструкция мне тоже наверняка понадобится. Большое спасибо.
Пример 6.13. Оператор OPEN в развернутом виде.
Если при запуске программы (Пример 6.13) в текущей директории присутствует файл «INFO.TXT» с явно указанным для него статусом «NEW» в операторе OPEN, то программа завершится по ошибке: «IOS > 0». Файл «INFO.TXT» является результатом работы программы и должен появиться после ее запуска.
Пример 3
Когда приведенный выше код компилируется и выполняется, он дает следующий результат –
Форматированный ввод-вывод
Форматированный ввод-вывод имеет следующий синтаксис:
fmt – спецификация формата
переменная-список представляет собой список переменных, которые будут считаны с клавиатуры или записаны на экране
fmt – спецификация формата
переменная-список представляет собой список переменных, которые будут считаны с клавиатуры или записаны на экране
Спецификация формата определяет способ отображения форматированных данных. Он состоит из строки, содержащей список дескрипторов редактирования в скобках.
Дескриптор редактирования указывает точный формат, например, ширину, цифры после десятичной точки и т. Д., В которых отображаются символы и цифры.
Пример 6.15. «Перемотка записей» текстового файла.
В заключение, стоит отметить, что в любой позиции файла, используя оператор ENDFILE, можно внести запись «Конец файла», при этом все последующие строки файла будут утеряны. В качестве параметра оператору ENDFILE указывается номер устройства, так же как для BACKSPACE и REWIND.
Описание программирования ввода/вывода прямого доступа (ACCESS = «DIRECT») и бесформатной формой представления данных (FORM = «UNFORMATTED») выходит за рамки данного учебного пособия.
Fortran позволяет вам читать данные и записывать данные в файлы.
В последней главе вы увидели, как читать данные и записывать данные в терминал. В этой главе вы изучите функции ввода и вывода файлов, предоставляемые Fortran.
Вы можете читать и писать в один или несколько файлов. Операторы OPEN, WRITE, READ и CLOSE позволяют вам достичь этого.
Пример 6.15. Копирование файлов.
При открытии существующего текстового файла оператором OPEN, текущая позиция чтения находится перед первой записью файла. Чтение первой записи перемещает позицию к следующей записи и т.д. При открытии нового файла и записи последовательно добавляются в конец файла – где постоянно находится позиция для записи. В связи с этим ля файлов последовательного доступа представляет интерес позиционирование внутри файла.
При помощи оператора BACKSPACE можно из любой позиции файла перейти к предыдущей (или только что прочитанной) записи файла, а при помощи оператора REWIND – перейти к началу файла. В качестве параметра оба оператора используют номер ассоциированного с файлом устройства, например «BACKSPACE 1» или «REWIND 4». Если файл уже позиционирован в начало, то применение этих операторов не повлечет за собой ошибки или изменения в позиционировании. Проиллюстрировать возможности позиционирования можно на своеобразном «плеере» файла с элементами «перемотки» записей (Пример 6.16). Для работы программы потребуется текстовый файл с именем «FILE1.TXT», с несколькими строками, не длиннее 80-ти символов.
Пример 2
Когда приведенный выше код компилируется и выполняется, он дает следующий результат: (предположим, что пользователь вводит имя Zara)
Пример 1
Когда приведенный выше код компилируется и выполняется, он дает следующий результат –
3 Answers 3
If you mean that the comments are only at the beginning of the file, it is fairly simple -- no need to count the comment lines or rewind file -- you can read the lines into a string and test whether they are a comment. Then you will eventually encounter a non-comment line. Problem: it will have been read into a string and thus not available for a regular read . solution . use "backspace" to unread one record so that you can now use normal file reads to read the rest of the file. A slightly more complicated solution would be necessary if comment lines were interspersed throughout the file -- as already stated, read the lines into a string, then read from the string.
P.S. It is officially "Fortran" since Fortran 90 -- it was "FORTRAN" for FORTRAN 77 and earlier.
And some test data to show how flexible the input data can be:
Thanks for all of your suggestions, and getting me started. It is very kind of you to help a lowly beginner like me ;) Can you please explain this line in more detail? read (UnitNum, *) (Array (i, j), j=1,NumCols) I understand the read statement, and that the second part is the iolist. This in not well defined in any documentation I have found. Thanks in advance.
I'm not real familiar with anything beyond FORTRAN 77 but here are a few pointers (and a working version of what you posted in your answer). First the working code (I added line numbers):
- line 6 - You needed to remove the quotes around 'file' in the FILE='file' assignment. As written you were using a file named file instead of the name passed in as the file parameter.
- line 10 - since you declared this as a function you need to assign a return value to the function name before you leave the function. I just assigned it a value of 0 to allow it to compile. I think what you want here is to pass the array you read in from the file back out of the routine. In that case you'll need to modify the type of the function (and assign X to myfile) or pass the array in as a parameter and allow it to be modified in the function. (in the old FORTRAN 77 world this was done with common blocks or pointers to the array, not sure how you do it in later versions of Fortran).
- line 14 - you need to assign the return value of the function to a variable. At least you did with my gfortran compiler. It wouldn't let me compile the program otherwise.
- line 14 (again) - the function call needs the name of the file (test.out) in quotes. You had it without quotes and so was having problems (this might be where your array reference error was coming from, I got different errors with my compiler.)
Instead of using a function, you could define this your myfile routine as a subroutine instead. In this case you would definitely need to pass in the array you want filled as a parameter. You wouldn't need line 10 and instead of assigning the return value to a variable in the main program you would 'call' the routine. i.e. line 14 would look like this:
EDIT: I posted this and then realized I forgot to answer the original questions. I did so and then for some reason couldn't connect to SO to upload the edits. So here they are finally.
That gets your routine compiling. To actually deal with the comment lines, you have several options (at least these are the ones that come to mind initially). These are in order from simplest/most brittle to more robust/general:
Which method you choose (and other people may have other suggestions) depends on your particular application. Good luck.
Открытие и закрытие файлов
Перед использованием файла вы должны открыть файл. Команда open используется для открытия файлов для чтения или записи. Самая простая форма команды –
Тем не менее, открытое заявление может иметь общую форму –
В следующей таблице описаны наиболее часто используемые спецификаторы.
Номер устройства u может быть любым числом в диапазоне 9-99, и это указывает на файл, вы можете выбрать любое число, но каждый открытый файл в программе должен иметь уникальный номер
IOSTAT = IOS
Это идентификатор состояния ввода / вывода и должен быть целочисленной переменной. Если оператор open успешен, то возвращаемое значение ios равно нулю, иначе ненулевое значение.
ERR = ошибка
Это метка, к которой переходит элемент управления в случае любой ошибки.
Имя файла, строка символов.
STATUS = STA
Показывает предыдущий статус файла. Символьная строка и может иметь одно из трех значений NEW, OLD или SCRATCH. Скретч-файл создается и удаляется при закрытии или завершении программы.
ДОСТУП = акк
Это режим доступа к файлу. Может иметь одно из двух значений, SEQUENTIAL или DIRECT. По умолчанию установлено значение SEQUENTIAL.
Это дает статус форматирования файла. Может иметь одно из двух значений: FORMATTED или UNFORMATTED. По умолчанию установлено значение UNFORMATTED
Он определяет длину каждой записи в файле прямого доступа.
Номер устройства u может быть любым числом в диапазоне 9-99, и это указывает на файл, вы можете выбрать любое число, но каждый открытый файл в программе должен иметь уникальный номер
IOSTAT = IOS
Это идентификатор состояния ввода / вывода и должен быть целочисленной переменной. Если оператор open успешен, то возвращаемое значение ios равно нулю, иначе ненулевое значение.
ERR = ошибка
Это метка, к которой переходит элемент управления в случае любой ошибки.
Имя файла, строка символов.
STATUS = STA
Показывает предыдущий статус файла. Символьная строка и может иметь одно из трех значений NEW, OLD или SCRATCH. Скретч-файл создается и удаляется при закрытии или завершении программы.
ДОСТУП = акк
Это режим доступа к файлу. Может иметь одно из двух значений, SEQUENTIAL или DIRECT. По умолчанию установлено значение SEQUENTIAL.
Это дает статус форматирования файла. Может иметь одно из двух значений: FORMATTED или UNFORMATTED. По умолчанию установлено значение UNFORMATTED
Он определяет длину каждой записи в файле прямого доступа.
После того, как файл был открыт, к нему обращаются операторы чтения и записи. После этого он должен быть закрыт с помощью оператора закрытия .
Оператор close имеет следующий синтаксис:
Обратите внимание, что параметры в скобках не являются обязательными.
Этот пример демонстрирует открытие нового файла для записи некоторых данных в файл.
Когда приведенный выше код компилируется и выполняется, он создает файл data1.dat и записывает в него значения массива x и y. И затем закрывает файл.
Чтение и запись в файл
Операции чтения и записи соответственно используются для чтения и записи в файл соответственно.
У них есть следующий синтаксис –
Большинство спецификаторов уже обсуждались в приведенной выше таблице.
Спецификатор END = s – это метка оператора, куда программа переходит, когда она достигает конца файла.
Этот пример демонстрирует чтение и запись в файл.
В этой программе мы читаем из файла, который мы создали в последнем примере, data1.dat, и отображаем его на экране.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат –
До сих пор мы видели, что мы можем читать данные с клавиатуры, используя оператор read * , и отображать вывод на экран, используя оператор print * , соответственно. Эта форма ввода-вывода является вводом-выводом произвольного формата и называется направленным на ввод-вывод списком .
Свободный формат простого ввода / вывода имеет вид –
Однако форматированный ввод / вывод дает вам больше гибкости по сравнению с передачей данных.
Пример 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.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.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).
Заявление о формате
Оператор формата позволяет смешивать и сопоставлять символьные, целые и реальные выходные данные в одном операторе. Следующий пример демонстрирует это –
Когда приведенный выше код компилируется и выполняется, он дает следующий результат –
Purpose: Create a program that takes two separate files, opens and reads them, assigns their contents to arrays, do some math with those arrays, create a new array with product numbers, print to a new file. Simple enough right?
PS. Please do not overwhelm me with a bunch of code monkey gobblety gook. I am a total programming novice. I do not understand all the lingo, that is why I came here instead of searching for help in existing websites. Thanks.
Например
Следующая таблица описывает дескрипторы –
Это используется для целочисленного вывода. Это принимает форму «rIw.m», где значения r, w и m приведены в таблице ниже. Целочисленные значения правильно выровнены в своих полях. Если ширина поля не достаточно велика, чтобы вместить целое число, то поле заполняется звездочками.
Это используется для вывода действительного числа. Это принимает форму ‘rFw.d’, где значения r, w и d приведены в таблице ниже. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками.
Это используется для реального вывода в экспоненциальной записи. Оператор дескриптора ‘E’ принимает форму ‘rEw.d’, где значения r, w и d приведены в таблице ниже. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками.
Обратите внимание, что для распечатывания действительного числа с тремя десятичными знаками необходима ширина поля не менее десяти. Один для знака мантиссы, два для нуля, четыре для мантиссы и два для самого показателя. В общем, w ≥ d + 7.
Это используется для реального результата (научная запись). Это принимает форму ‘rESw.d’, где значения r, w и d приведены в таблице ниже. Описанный выше «E» дескриптор несколько отличается от традиционного общеизвестного «научного обозначения». Научная нотация имеет мантиссу в диапазоне от 1,0 до 10,0 в отличие от дескриптора E, который имеет мантиссу в диапазоне от 0,1 до 1,0. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками. Здесь также поле ширины должно удовлетворять выражению w ≥ d + 7
Это используется для вывода символов. Это принимает форму ‘rAw’, где значения r и w приведены в таблице ниже. Типы символов правильны в своих полях. Если ширина поля недостаточно велика, чтобы вместить строку символов, то поле заполняется первыми символами ‘w’ строки.
Это используется для вывода пространства. Это принимает форму ‘nX’, где ‘n’ – количество желаемых пробелов.
Дескриптор косой черты – используется для вставки пустых строк. Это принимает форму ‘/’ и заставляет следующий вывод данных быть в новой строке.
Это используется для целочисленного вывода. Это принимает форму «rIw.m», где значения r, w и m приведены в таблице ниже. Целочисленные значения правильно выровнены в своих полях. Если ширина поля не достаточно велика, чтобы вместить целое число, то поле заполняется звездочками.
Это используется для вывода действительного числа. Это принимает форму ‘rFw.d’, где значения r, w и d приведены в таблице ниже. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками.
Это используется для реального вывода в экспоненциальной записи. Оператор дескриптора ‘E’ принимает форму ‘rEw.d’, где значения r, w и d приведены в таблице ниже. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками.
Обратите внимание, что для распечатывания действительного числа с тремя десятичными знаками необходима ширина поля не менее десяти. Один для знака мантиссы, два для нуля, четыре для мантиссы и два для самого показателя. В общем, w ≥ d + 7.
Это используется для реального результата (научная запись). Это принимает форму ‘rESw.d’, где значения r, w и d приведены в таблице ниже. Описанный выше «E» дескриптор несколько отличается от традиционного общеизвестного «научного обозначения». Научная нотация имеет мантиссу в диапазоне от 1,0 до 10,0 в отличие от дескриптора E, который имеет мантиссу в диапазоне от 0,1 до 1,0. Реальные ценности оправданы в своих областях. Если ширина поля недостаточно велика, чтобы вместить действительное число, то поле заполняется звездочками. Здесь также поле ширины должно удовлетворять выражению w ≥ d + 7
Это используется для вывода символов. Это принимает форму ‘rAw’, где значения r и w приведены в таблице ниже. Типы символов правильны в своих полях. Если ширина поля недостаточно велика, чтобы вместить строку символов, то поле заполняется первыми символами ‘w’ строки.
Это используется для вывода пространства. Это принимает форму ‘nX’, где ‘n’ – количество желаемых пробелов.
Дескриптор косой черты – используется для вставки пустых строк. Это принимает форму ‘/’ и заставляет следующий вывод данных быть в новой строке.
Следующие символы используются с дескрипторами формата –
Количество цифр справа от десятичного разряда для реального ввода или вывода
Минимальное количество отображаемых цифр
Количество пропущенных пробелов
Количество повторов – количество раз, чтобы использовать дескриптор или группу дескрипторов
Ширина поля – количество символов, используемых для ввода или вывода
Количество цифр справа от десятичного разряда для реального ввода или вывода
Минимальное количество отображаемых цифр
Количество пропущенных пробелов
Количество повторов – количество раз, чтобы использовать дескриптор или группу дескрипторов
Ширина поля – количество символов, используемых для ввода или вывода
Читайте также: