Здравствуйте.
Нужна помощь... Как открыть файл, не зная его имя (задан только каталог, где находится)...
Заранее спасибо.
Файлы |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Файлы |
Unreal |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 15 Репутация: 0 |
Здравствуйте.
Нужна помощь... Как открыть файл, не зная его имя (задан только каталог, где находится)... Заранее спасибо. |
BlackShadow |
Сообщение
#21
|
Гость |
Код Var f:Text; s:String; Begin Assign(f,'In.Txt'); Reset(f); ReadLn(f,s); WriterLn(s); ReadLn(f,s); WriterLn(s); ReadLn(f,s); WriterLn(s); Reset(f); ReadLn(f,s); WriterLn(s); ReadLn(f,s); WriterLn(s); ReadLn(f,s); WriterLn(s); Close(f) End. Должно вывести две одинаковые тройки строчек. |
Altair |
Сообщение
#22
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Да, что-то я стормозил. (с кем не бывает)
Если файл уже открыт, то он сначала закрывается, а затем вновь открывается. Текущая позиция указателя устанавливается на начало файла. А вот если надо на произвольные элемент переместить, то не выйдет с текстовыми. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
BlackShadow |
Сообщение
#23
|
Гость |
Я бы тоже не был так уверен...
Текстовый файл по сути своей запись типа TextRec (см. в "АЗЫ", я там о ней упоминал). Вот оттуда можно взять и вытянуть Handle файла (см. свой недавний вопрос), а затем уже дёргать указатель куда захочешь. Проблема только в том, что для установки на 30-ую строку придётся считать ещё 29 Но доступ к n-ному символу осуществляется моментом Ладно, ладно - согласен, извращенец... Ну и что... |
Altair |
Сообщение
#24
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Цитата Ладно, ладно - согласен, извращенец... Ну и что... Я бы так не сказал, это между прочим есть оптимизация, т.к. это будет быстрее, чем закрывать файл, открывать заново, и заводив переменную, отсчитывать на n элемент. Кстати, а что будет, если текстовый файл описать как File of string? Надо попробовать ... -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
BlackShadow |
Сообщение
#25
|
Гость |
Попробуй, попробуй.
Только не забывай, что String - переменная "непостоянного" размера, а File Of может описываться для типов "фиксированного размера". Даже, если у тебя Код MyRec=Record a:Integer; b:String End; То File Of MyRec - не прокатит, а если Код MyRec=Record a:Integer; b:String[255] End; то File Of MyRec пойдёт, но считываться каждый раз будет по 258 байт. |
Altair |
Сообщение
#26
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Попробовал, не получилось.
(дальше для тех, кому интересно) Код Var f:file of string; fn:string; n:longint; begin assign(f,'a'); rewrite(f); fn:='aaaaa'; write(f,fn); fn:='bbbbbbb'; write(f,fn); close(f); end. Это запись файла. В результате в файле a, если его читать как текстовый, будет: aaaaa (потом до 256 символа пробелы), дальше: bbbbbbb И такая программа: Код Var f:file of string; fn:string; n:longint; begin readln(fn); assign(f,fn); reset(f); for n:=0 to filesize(f)-1 do begin seek(f,n); read(f,fn); writeln(fn); end; close(f); end. Работать не будет (она ничего не выведет на экран). Этот факт доказывает, что в памяти под простую строку резервируется 256 байт! -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
APAL |
Сообщение
#27
|
Смотрю... Группа: Пользователи Сообщений: 1 055 Пол: Мужской Реальное имя: Пшеничный Алексей Анатольевич Репутация: 6 |
Может поиграться с "file of char;"?
-------------------- |
Altair |
Сообщение
#28
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Попробовать можно ...
Только потеряются особенности текстового ("строчность" ) -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
BlackShadow |
Сообщение
#29
|
Гость |
Не так уж и сложно написать что-нибудь типа Function GetString(F:TCharFile):String):String...
|
Stream |
Сообщение
#30
|
Новичок Группа: Пользователи Сообщений: 10 Репутация: 0 |
А вы в курсе, что в типизированном файле чтение происходит в тыщу раз медленнее, чем в техтовом...
|
Romtek |
Сообщение
#31
|
Знаток Группа: Пользователи Сообщений: 303 Пол: Мужской Реальное имя: Роман Репутация: 2 |
Stream, обоснуй.
-------------------- Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
|
virt |
Сообщение
#32
|
Знаток Группа: Пользователи Сообщений: 419 Пол: Мужской Репутация: 6 |
romtek
ну конечно не в тысячу ,но так как типизированный файл имеет некую гипотетическую структуру ,то процедура чтения как-то её анализирует. если ты сам будешь считывать файл как символьный ,а потом решать что там к чему в нем и нет ли ошибки ,то получается что дольше. -------------------- |
BlackShadow |
Сообщение
#33
|
Гость |
Бред.
|
P@sh@ |
Сообщение
#34
|
Бывалый Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: 2 |
точно бред, никакой проверки на корректность данных при типизированном чтении не происходит (имхо), а так как данные считываются блоками, будет еще быстрее, чем из текстового (там же каждый символ надо анализировать на конец строки)
впрочем, всякое может быть, я ни разу (!) в своей практике не использовал типизированные файловые переменные, только text (textfile в дельфе) для ведения всяческих логов и просто file для бинарного доступа |
BlackShadow |
Сообщение
#35
|
Гость |
То же самое...
|
Altair |
Сообщение
#36
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Цитата А вы в курсе, что в типизированном файле чтение происходит в тыщу раз медленнее, чем в техтовом... Это бред! Если на то пошло, то наоборот, процедуры для текстовых файлов работают медленнее процедур для типизированных и не типизированных. Пример: EOF работает в 2 раза медленнее, чем FileSize( при правильном использовании). -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
BlackShadow |
Сообщение
#37
|
Гость |
EOF и FileSize - это 2 разные вещи. Пояни про что ты говоришь.
|
Altair |
Сообщение
#38
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Конечно разные, я к тому что если использовать текстовый файл, то для проверки конца обычно используеться EOF, а в типизированных используют текущую позицию в файле и проверяют равна ли она FileSize.
-------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
BlackShadow |
Сообщение
#39
|
Гость |
Oleg_Z прав. В общем случае EOF работает примерно так:
1) temp = FilePos; 2) size = Seek(end); 3) Seek(temp) 4) eof:=temp=size; Ну, фигурально выражаясь. Под DOS пункты 1..3 выполняются одной и той же функцией. Единственное на яём может произойти экономия времени - на пункте 1, но я не помню хранится ли текущий указатель в переменной типа File. Судя по тому, что скорость падает в 2 раза, то храниться |
Altair |
Сообщение
#40
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Кстати, а мне кажется есть хороший способ ускорить процедуру EOF .
Поробую ... === добавил позже, подумав === Нельзя никак укорить эту функцию. Где-то прога хранит текущий указатель. Вот если найти где и как она хранит его ... Сообщение отредактировано: Oleg_Z - -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Текстовая версия | 15.05.2024 9:08 |