powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / А можно ли ф функцию файл передать:
14 сообщений из 14, страница 1 из 1
А можно ли ф функцию файл передать:
    #32213820
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть:
f1: file of integer;
f2: file of string;
Хотелось бы чтение из файла в массив, оформить в виде одной функции, типа такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
AssignFile(f,'file.dat');
 Reset(f);
 n:= 0 ;
 While not EOF(f) do
 begin
   SetLength(str,n+ 1 );
   Read(f,str[n]);
   inc(n);
 end;
CloseFile(fl);

То есть в функцию передаётся переменная описаная как типизированный файл, имя файла и динамический массив, куда считывать. А то надо считать с 10 файлов, и не дело писать друг за другом одно и тоже, меняя тоько параметры...
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32213829
MW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А глобальные переменные отменили?
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32213835
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, но я не могу сначалf обявить, что f:file of integer, а потом f:file of string
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32213840
MW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как ты заранее узнаешь тип файла?
Ведь считывание все равно будет вестись по-разному?!?!
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32213882
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Считывание типизированных любых файлов можно считать в массив, как описано выше.
Проблема только заглючается в том чтобы в AssignFile задать тип привязываемого файла...
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32214576
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, ты где такие задачки находишь? :) Взял бы книжку по паскалю что ли почитал. :)
Типизированный файл на то и типизированный, чтобы при его объявлении указать его тип. И других способов дать знать компилятору тип файла в паскале не существует в принципе. Функция AssignFile связывает типизированный файл с конкретным файлом на диске.

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

В общем, у тебя в итоге получится столько функций, сколько типов файлов используется в программе. И по другому, насколько я понимаю, с типизированными файлами никак не сделать. Либо использовать нетипизированные файлы.
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32214601
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот именно использовать нетипизированные файлы ,
и работать через
BlockRead ,BlockWrite ...
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32214768
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А нельзя сделать AssignFile за функцией, а потом передать как нить функции его дескриптор, ну или что нить такое, адресс переменной которой присваивал и т.д, а в фукции берём адрес этой переменной и читаем не так read(f, var), а вот так read(pointer^,var); Пробовал так делать не получается.. :-)))
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32214791
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дорогой AndreyBond, у меня стойкое ощущение, что ты у нас пытаешься выяснить конечный этап реализации задачи, в то время как сам алгоритм её решения продуман как-то криво.
Давай сначала: ЧТО НУЖНО СДЕЛАТЬ? Считать из файлов информацию во внутрениие структуры данных? Сколько файлов, какие, что потом со структурам делается? Мы изначально знаем их именя и количетсво или это величины переменные? И вообще откуда взялись файлы с "типизированной струткурой"? Это данные самой программы или другой?

Что же касается файловых переменных, то они через указатель не передаются, поскольку и так уже являются указателями на структуру описния файла. Причём, если я правильно помню, то файловые переменные являются особым типом, который не разименовывается. Кстати, в паскале обычно принято в таких случаях использовать ключевое слово var перед названием параметра в объявлении процедуры или функции. То есть, если написать

procedure MyProc(var i:integer);

то при изменении значения i внутри процедуры после выхода из неё мы будем иметь это изменившееся значение, а если var не писать (стандартное объявление), то внутри поцедуры значение может меняться как угодно, но после выхода из процедуры значение переменной не изменится. В первом случае компилятор паскаля автоматически перейдёт на использование указателя, а во втором случае создаётся копия на стеке.
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32214899
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот отрывки из кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
type
  rClient = record
    ID:Integer;
    Name:string[ 50 ];
  end;
  rTran = record
    ID:Byte;
    Account:string[ 20 ];
    Capt:string[ 120 ];
  end;
  rMark = record
    LAT:string[ 3 ];
    Name:string[ 10 ];
  end;

  tClients = array of rClient;
  tTrans = array of rTran;
  tMarks = array of rMark;

var
  Client: tClients;
  Trans: tTrans;
  Marks: tMarks;
  fClient: file of rClient;
  fTrans: file of rTran;
  fMark: file of rMark;

При создании формы нужно прочитать из файлов в переменные, делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
procedure rbThread.Execute;
var
  n:integer;
begin
  AssignFile(fMark,'Marks.dat');
  Reset(fMark);
  n:= 0 ;
  While not EOF(fMark) do
  begin
    SetLength(Marks,n+ 1 );
    Read(fMark,Marks[n]);
    inc(n);
  end;
  CloseFile(fMark);
  AssignFile(fClient,'Clients.dat');
  Reset(fClient);
  n:= 0 ;
  While not EOF(fClient) do
  begin
    SetLength(Client,n+ 1 );
    Read(fClient,Client[n]);
    inc(n);
  end;
  CloseFile(fClient);
  AssignFile(fTrans,'Trans.dat');
  Reset(fTrans);
  n:= 0 ;
  While not EOF(fTrans) do
  begin
    SetLength(Trans,n+ 1 );
    Read(fTrans,Trans[n]);
    inc(n);
  end;
  CloseFile(fTrans);
end;

А теперь заметьте, что три раза код повторяется, вот еслиб была возможность в процедуру передать указатель на файл, то было бы просто отлично.
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32214940
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, повторяется. Работать работает? :) Или хочется, чтобы было ещё лучше? :)

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

Короче, из-за трёх файлов я бы не стал время тратить. Опять же, я уже давно record в чистом виде не использую, в основном объекты. При этом у меня все объекты умеют себя сохранять в поток и загружать из потока. Там тоже писанины, конечно, побольше, чем с типизированными файлами и массивами, зато потом появляется масса удобств. Да и это зависит от количества типов/классов. Когда их становится больше десятка, то выгоднее написать общие функции и процедуры, а иначе проще и быстрее написать несколько раз одно и тоже (благо функции copy/paste в Delphi работают очень хорошо :) ).
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32215134
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В том то и беда, что таких файлов не 3, а около 20, да и в типе запись очень много параметров, это я вырезки привёл..
А не подскажешь где можно почиать про классы, как их правильно строить и т.д. и т.п. на русском языке..
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32215151
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в книжке ....
...
Рейтинг: 0 / 0
А можно ли ф функцию файл передать:
    #32215245
AndreyBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в инете нигде чтоль нет на русском, с хорошим писанием...
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / А можно ли ф функцию файл передать:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]