Как сделать массив из файла паскаль

Обновлено: 07.07.2024

Есть TP 7.0.
Имеется файл my.txt, в котором есть массив чисел через пробел:
4 3 10
Не могу этот простейший массив из файла передать на экран ( С обычным текстом проблем нет, но когда в файле массив. )
Так не получается:

const N =3;
var f:text;
s: array [1..N] of integer;
begin
assign(f,h:\bp\bin\moi pro\my.txt');
read(f,s);
writeln(s);
close(f);
end.
Может кто-нибудь знает как правильно, то подскажите а то пишет ошибку
Cannot read or write.

Very Need Help Thank you very mutch

Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.

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

с одним массивом всё понятно ., при помощи цикла считать поэлементно массив.

но как быть с двумя. непонятно как прочитать первый элемент второго массива
3 5 8 19
2 4 9 16 и чем отделять один массив от другого, т.е как обратиться к первому элементу второго массива.

В файле нельзя хранить двумерный массив, если это текстовой файл. как в клали туда элементы, так и доставайте. На пример у вас был массив 3 * 2 . Вы положили по элементам 1 -ю строку, потом 2 -ю и 3 -ю. Так же и доставайте. А сколько было элементов и какая размерность массива надо самому помнить или ставuть текстовые указатели в файле. Лучше вообще использовать типизированный файл:

type
TArr = array [1..10] of Integer;

var
a: array [1..5] of TArr;
f: file of TArr;
.
Rewrite (f);
.

' width='8' height='8' /> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется .
2. Все тексты программ должны помещаться в теги [code=pas] . [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме.
8. Спрашивайте и отвечайте четко и по существу.

Репутация: 0

Господа модераторы, прошу извинения за ругательный характер заголовка предыдущей созданной мной темой.
А теперь по сабжу. Очень прошу, помогите пожалуйста: не могу найти ни в одной справке, как из файла перекопировать данные в массив. Причём не надо писать программу, опишите только одну или две строчки (уж не знаю, сколько места эта операция занимает) того, как это делается. Заранее благодарен.

Репутация: 6

f - файл
m - массив

или через BlockRead

Думаю найдется еще несколько способов - все зависит от поставленной задачи.

Если что-то не делает того, что вы запланировали ему делать - это еще не означает, что оно бесполезно.
--------------------
Прежде, чем задать вопрос - Правила :: FAQ :: Поиск

Репутация: 45

Господа модераторы, прошу извинения за ругательный характер заголовка предыдущей созданной мной темой

И тему я переименовал. :D
По делу:
-------------------------------------
Если файл тектовый, то важно знать как в нем записанны элементы массива, если посточно, то используем процедуру ReadLn, для считывания элементов в файл, а если эл-ты массива записанны в строчку через пробел, то используем Read. (процедуры в цикле "пока нет конца файла повторять" - "While Not eof(f) do")
Если файл двоичный, то нужно знать его структуру.
Например:
F:file of byte
Значит каждый эл-т файла может быть эл-том массива.
Или f:file of array[1..n];
значит в файле уже записан массив, и его просто надо считать так:
read(f,a), где a - массив, точно такой как в файле.

-----
Т.е. для считывания из файла эл-тов надо использовать в цикле процедуры read или readln.


Ну если файл не типизированный, то можно, только это сложнее и не нужно для учебных задач.
Это скорее для настоящих задач, т.к. используя BlockRead можно увеличить до максимума скорость чтения, если читать данные, размер которых совпадает с размером кластера.

Существенной особенностью всех рассмотренных до сих пор значений производных типов является наличие в них конечного, наперед заданного числа компонент. Так, в значении многомерного массива это число можно определить, зная количество компонент по каждому измерению, а в значении записи это число определяется количеством и типом полей. Таким образом, заранее, еще до выполнения программы, по этому описанию можно выделить необходимый объем памяти машины для хранения значений переменных этих типов. Но существует определенный класс задач и определенные ситуации, когда количество компонент (пусть даже одного и того же из известных уже типов) заранее определить невозможно, оно выясняется только в процессе решения задачи. Поэтому возникает необходимость в специальном типе значений, которые представляют собой произвольные последовательности элементов одного и того же типа, причем длина этих последовательностей заранее не определяется, а конкретизируется в процессе выполнения программы. Этот тип значений получил название файлового типа. Условно файл в Паскале можно изобразить как некоторую ленту, у которой есть начало, а конец не фиксируется. Элементы файла записываются на эту ленту последовательно друг за другом:

файл Паскаля (Pascal)

где F – имя файла, а F1, F2, F3, F4 – его элементы. Файл во многом напоминает магнитную ленту, начало которой заполнено записями, а конец пока свободен. В программировании существует несколько разновидностей файлов, отличающихся методом доступа к его компонентам:файлы последовательного доступа и файлы произвольного доступа.

Простейший метод доступа состоит в том, что по файлу можно двигаться только последовательно, начиная с первого его элемента, и, кроме этого, всегда существует возможность начать просмотр файла с его начала. Таким образом, чтобы добраться до пятого элемента файла, необходимо, начав с первого элемента, пройти через предыдущие четыре. Такие файлы называют файлами последовательного доступа. У последовательного файла доступен всегда лишь очередной элемент. Если в процессе решения задачи необходим какой-либо из предыдущих элементов, то необходимо вернуться в начало файла и последовательно пройти все его элементы до нужного.

Файлы произвольного доступа Паскаля позволяют вызывать компоненты в любом порядке по их номеру.

Важной особенностью файлов является то, что данные, содержащиеся в файле, переносятся на внешние носители. Файловый тип Паскаля – это единственный тип значений, посредством которого данные, обрабатываемые программой, могут быть получены извне, а результаты могут быть переданы во внешний мир. Это единственный тип значений, который связывает программу с внешними устройствами ЭВМ.

Работа с файлами в Паскале

Файловый тип или переменную файлового типа в Паскале можно задать одним из трех способов:

Здесь – имя файлового типа (правильный идентификатор); File, of – зарезервированные слова (файл, из); – любой тип Паскаля, кроме файлов.

Пример описания файлового типа в Паскале

Type
Product= record
Name: string;
Code: word;
End;
Text80= file of string[80];
Var
F1: file of char;
F2: text;
F3: file;
F4: Text80;
F5: file of Product;

В зависимости от способа объявления можно выделить три вида файлов Паскаля:

  • типизированные файлы Паскаля(задаются предложением file of..);
  • текстовые файлы Паскаля(определяются типом text);
  • нетипизированные файлы Паскаля(определяются типом file).

Следует помнить, что физические файлы на магнитных дисках и переменные файлового типа в программе на Паскале – объекты различные. Переменные файлового типа в Паскале могут соответствовать не только физическим файлам, но и логическим устройствам, связанным с вводом/выводом информации. Например, клавиатуре и экрану соответствуют файлы со стандартными именами Input, Output.

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

Переменные файлового типа используются в программе только в качестве параметров собственных и стандартных процедур и функций.

Основные процедуры и функции для работы с файлами

1.До начала работы с файлами в Паскале необходимо установить связь между файловой переменной и именем физического дискового файла:

Следует помнить, что имя дискового файла при необходимости должно содержать путь доступа к этому файлу, включая имя дисковода. При этом имя дискового файла – строковая величина, т.е. должна быть заключена в апострофы. Например:

Пример процедуры Assign в Паскале

Если путь не указан, то программа будет искать файл в своем рабочем каталоге и по указанным путям в autoexec.bat.

Вместо имени дискового файла можно указать имя логического устройства, каждое из которых имеет стандартное имя:

CON – консоль, т.е. клавиатура-дисплей;

PRN – принтер. Если к компьютеру подключено несколько принтеров, доступ к ним осуществляется по именам LPT1, LPT2, LPT3.

Не разрешается связывать с одним физическим файлом более одной файловой переменной.

2.После окончания работы с файлами на Паскале, они должны быть закрыты.

При выполнении этой процедуры закрываются соответствующие физические файлы и фиксируются сделанные изменения. Следует иметь в виду, что при выполнении процедуры close связь файловой переменной с именем дискового файла, установленная ранее процедурой assign, сохраняется, следовательно, файл можно повторно открыть без дополнительного использования процедуры assign.

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

3.Подготовка к записи в файл Паскаля

Процедура Rewrite(f) (где f – имя файловой переменной) устанавливает файл с именем f в начальное состояние режима записи, в результате чего указатель устанавливается на первую позицию файла. Если ранее в этот файл были записаны какие-либо элементы, то они становятся недоступными. Результат выполнения процедуры rewrite(f); выглядит следующим образом:

файл Паскаля (Pascal)

4.Запись в файл Паскаля

При выполнении процедуры write(f, x) в ту позицию, на которую показывает указатель, записывается очередная компонента, после чего указатель смещается на следующую позицию. Естественно, тип выражения х должен совпадать с типом компонент файла. Результат действия процедуры write(f, x) можно изобразить так:

Состояние файла f до выполнения процедуры

файл Паскаля (Pascal)

Состояние файла f после выполнения процедуры

файл Паскаля (Pascal)

Для типизированных файлов выполняется следующее утверждение: если в списке записи перечислено несколько выражений, то они записываются в файл, начиная с первой доступной позиции, а указатель смещается на число позиций, равное числу записываемых выражений.

5.Подготовка файла к чтению Паскаля

Эта процедура ищет на диске уже существующий файл и переводит его в режим чтения, устанавливая указатель на первую позицию файла. Результат выполнения этой процедуры можно изобразить следующим образом:

файл Паскаля (Pascal)

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

6.Чтение из файла в Паскале

Рассмотрим результат действия процедуры read(f, v):

Состояние файла f и переменной v до выполнения процедуры:

файл Паскаля (Pascal)

Состояние файла f и переменной v после выполнения процедуры:

файл Паскаля (Pascal)

Для типизированных файлов при выполнении процедуры read() последовательно считывается, начиная с текущей позиции указателя, число компонент файла, соответствующее числу переменных в списке, а указатель смещается на это число позиций.

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

7.Функция определения достижения конца файла в Паскале

Название этой функции является сложносокращенным словом от end of file. Значение этой функции имеет значение true, если конец файла уже достигнут, т.е. указатель стоит на позиции, следующей за последней компонентой файла. В противном случае значение функции – false.

8.Изменение имени файла в Паскале

Здесь новое_ имя_ файла – строковое выражение, содержащее новое имя файла, возможно с указанием пути доступа к нему.

Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.

9.Уничтожение файла в Паскале

Перед выполнением этой процедуры необходимо закрыть файл, если он ранее был открыт.

10.Уничтожение части файла от текущей позиции указателя до конца в Паскале

11.Файл Паскаля может быть открыт для добавления записей в конец файла

Типизированные файлы Паскаля. Длина любого компонента типизированного файла строго постоянна, т.к. тип компонент определяется при описании, а, следовательно, определяется объем памяти, отводимый под каждую компоненту. Это дает возможность организовать прямой доступ к каждой компоненте (т.е. доступ по порядковому номеру).

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

Для облегчения перемещения указателя по файлу и доступа к компонентам типизированного файла существуют специальные процедуры и функции:

fileSize( ) – функция Паскаля, определяющая число компонентов в файле;

filePos( ) – функция Паскаля, значением которой является текущая позиция указателя;

seek( ,n) – процедура Паскаля, смещающая указатель на компоненту файла с номером n. Так, процедура seek( ,0) установит указатель в начало файла, а процедура seek( , FileSize( )) установит указатель на признак конца файла.

Текстовые файлы Паскаля. Текстовые файлы предназначены для хранения текстовой информации. Именно в таких файлах хранятся, например, исходные тексты программ. Компоненты текстовых файлов могут иметь переменную длину, что существенно влияет на характер работы с ними. Доступ к каждой строке текстового файла Паскаля возможен лишь последовательно, начиная с первой. К текстовым файлам применимы процедуры assign, reset, rewrite, read, write и функция eof. Процедуры и функции seek, filepos, filesize к ним не применяются. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN(end of line – конец строки). Для определения достижения конца строки существует одноименная логическая функция EOLN( ), которая принимает значение true, если конец строки достигнут.

Форма обращения к процедурам write и read для текстовых и типизированных файлов одинакова, но их использование принципиально различается.

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

  • текстовые файлы удобнее для восприятия человеком, а типизированные соответствуют машинному представлению объектов;
  • текстовые файлы, как правило, длиннее типизированных;
  • длина текстовых файлов зависит не только от количества записей, но и от величины переменных.

Но, вообще-то, такой файл не понимает не только машина, а и человек.

Чтобы избежать этой ошибки, достаточно вставить при записи в файл после каждой переменной пробел. Тогда программа при каждом чтении берет символы от пробела до пробела и правильно преобразует текстовое представление в число.

Кроме процедур read и write при работе с текстовыми файлами используются их разновидности readln и writeln. Отличие заключается в том, что процедура writeln после записи заданного списка записывает в файл специальный маркер конца строки. Этот признак воспринимается как переход к новой строке. Процедура readln после считывания заданного списка ищет в файле следующий признак конца строки и подготавливается к чтению с начала следующей строки.

Пример решения задачи с файлами Паскаля

Пояснения: нам понадобятся две файловые переменные f1 и f2, поскольку оба файла текстовые, то тип переменных будет text. Задача разбивается на два этапа: первый – формирование первого файла; второй – чтение первого файла и формирование второго.

Для завершенности решения задачи есть смысл добавить еще одну часть, которая в задаче явно не указана – вывод на экран содержимого второго файла.

обучение PascalABC

Все предыдущие примеры программ на этом сайте выводили данные непосредственно на экран компьютера. Но данные можно выводить в файлы на внешние носители.

Рассмотрим пример программы на PascalABC, которая считывает исходные данные из внешнего файла. Считает сумму и произведение. Записывает результат тоже во внешний файл.

текстовые файлы паскаль

Но прежде немного справочной информации.

Текстовые файлы Паскаль

Файл — это упорядоченная последовательность однотипных компонентов, расположенных на внешнем носителе. Файлы предназначены только для хранения информации, а обработка этой информации осуществляется программами.

В Паскале для связи программы с файлом служит файловая переменная, которая обязательно должна быть указана в разделе описаний VAR.

Текстовый файл в PascalABC — это совокупность строк произвольной длины, разделенных между собой маркерами конца строки, а весь файл заканчивается маркером — конец файла.

Текстовые файлы являются файлами с последовательным доступом. В любой момент времени доступна только одна запись файла. Другие записи становятся доступными лишь в результате последовательного продвижения по файлу.

Чтобы программа смогла различать записи данных в текстовом файле, их разделяют пробелами. Например, 20 30 45 озеро.

Перед использованием файловой переменной она должна быть связана с внешним файлом с помощью вызова процедуры Аssign.

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

Наши файлы расположены в рабочем каталоге PascalABC (C:\PABCWork).

Когда связь с внешним файлом установлена, для подготовки ее к операции ввода или вывода файловая переменная должна быть “открыта”. Существующий файл можно открыть с помощью процедуры Reset, а новый файл можно создать и открыть с помощью процедуры Rewrite. Текстовые файлы, открытые с помощью процедуры Reset доступны только по чтению, а текстовые файлы, открытые с помощью процедуры Rewrite, доступны только по записи.

Для текстовых файлов существует специальный вид операций чтения и записи (read и write), который позволяют вам считывать и записывать значения, тип которых отличается от символьного типа. Такие значения автоматически переводятся в символьное представление и обратно. Например, Read(f,i), где i — переменная целого типа, приведет к считыванию последовательности цифр, интерпретации этой последовательности, как десятичного числа, и сохранению его в i.

Читайте также: