Здравствуйте.
Нужна помощь... Как открыть файл, не зная его имя (задан только каталог, где находится)...
Заранее спасибо.
Какие-то данные о файле все же нужны.
Открыть его можно, в следующих случаях:
Большое спасибо...
Кстати, у меня последний случай...
Пожалуйста
В вашем случае (перебор всех файлов) можно использовать (нужно т.е.) цикл:
FindFirst('*.TXT', AnyFile, A); ---> "Type mismatch"
Так стоп. Значит вы не правильно описали переменную A.
Покажите весь код (или хотя-бы ту часть, где переменные описываются и модули подключаются.
Что там могло быть не правильно, я не осознал... Но к вечеру, прошу заметить, ЗАГРУЗИВ СВОЙ "НЕ РАБОТАЮЩИЙ" КОД, все прекрасно заработало...
Появился еще один вопрос, возможно ли открыть текстовой файл для продолжения записи, не стирая данные, как это делает ReWrite? И не прибегая к типизированным и нетипизированным файлам...
Так, я понял, что первая проблемма с несовместимостью типов разрешена.
Эта ошибка могла быть по 3 причинам:
Скорее третья причина... А каким образом в типизированном файле перейти на следующую строку?... А на счет табуляции, с пробелами не получится, выравнивать текст разной длины...
Табуляция, насколько я помню, Олег, это выравнивание под определённую длинну, а не отступ, тем более от какого-то конкретного края.
Ага, понял ,это у меня ассоциация табуляции и клавиши TAB Хотя выравнивание ИМХО называется форматирование текста.
Ну текст можно выравнить несколькими способами:
Такой еще вопрос: Создан ЕХЕ файл, при запуске которого идет обработка текстовых файлов... Как сделать, чтобы программа обрабатывала всегда только те файлы, которые лежат в ее каталоге, при этом местоположение ЕХЕ файла меняется?. Т.е. кинули в любую папку - запустили - обработала те файлы которые лежат в этой папке...
При связывании файла, надо не указывать полный путь к файлу, а только имя:
т.е. не так:
assign(f,'C:\windows\sss.txt');
А так:
assign(f,'sss.txt');
---------
Процедуры FindFirst и FindNext ищут файл в текущем каталоге.
Текущий каталог в программе - тот, в котором находиться эта прога.
Можно сменить текущий каталог процедурой CHDIR('каталог');
Хорошо, а почему она обрабатывает только 10 файлов? Когда в каталоге 31...
Добавлено (19.06.04 4:28):
И еще... Где можно найти КОД процедупы READ?
2 причины:
1. Вы их 10 одновременно открываете.
(странно, тогда должно быть ограничение - 14 файлов )
2. Другие файлы не подходят по условию поиска (FindFirst)
может у остальных другое расширение или еще что.
А код выложить не можете?
Добавлено (19.06.04 4:39):
Есть ли процедура, с помощью которой текстовой файл можно открыть и для записи и для чтения, одновременно...?
Добавлено (19.06.04 8:37):
И возможно ли, во время работы в текстовом файле, вернуть курсор в начало файла?
Открыть текстовый файл одновременно для чтения и записи нельзя.
У меня была программка для чтения файла в память, там с ним можно делать все что угодно, а потом снова записывать на диск, могу ее поискать если надо.
Oleg_Z, а Reset(TextoviyFile) что сделает?
-> BlackShadow... Если можно подробнее...
Да, что-то я стормозил. (с кем не бывает)
Если файл уже открыт, то он сначала закрывается, а затем вновь
открывается. Текущая позиция указателя устанавливается на
начало файла.
А вот если надо на произвольные элемент переместить, то не выйдет с текстовыми.
Я бы тоже не был так уверен...
Текстовый файл по сути своей запись типа TextRec (см. в "АЗЫ", я там о ней упоминал). Вот оттуда можно взять и вытянуть Handle файла (см. свой недавний вопрос), а затем уже дёргать указатель куда захочешь. Проблема только в том, что для установки на 30-ую строку придётся считать ещё 29 Но доступ к n-ному символу осуществляется моментом
Ладно, ладно - согласен, извращенец... Ну и что...
Попробуй, попробуй.
Только не забывай, что String - переменная "непостоянного" размера, а File Of может описываться для типов "фиксированного размера". Даже, если у тебя
Попробовал, не получилось.
(дальше для тех, кому интересно)
Может поиграться с "file of char;"?
Попробовать можно ...
Только потеряются особенности текстового ("строчность" )
Не так уж и сложно написать что-нибудь типа Function GetString(F:TCharFile):String):String...
А вы в курсе, что в типизированном файле чтение происходит в тыщу раз медленнее, чем в техтовом...
Stream, обоснуй.
romtek
ну конечно не в тысячу ,но так как типизированный файл имеет некую гипотетическую структуру ,то процедура чтения как-то её анализирует.
если ты сам будешь считывать файл как символьный ,а потом решать что там к чему в нем и нет ли ошибки ,то получается что дольше.
Бред.
точно бред, никакой проверки на корректность данных при типизированном чтении не происходит (имхо), а так как данные считываются блоками, будет еще быстрее, чем из текстового (там же каждый символ надо анализировать на конец строки)
впрочем, всякое может быть, я ни разу (!) в своей практике не использовал типизированные файловые переменные, только text (textfile в дельфе) для ведения всяческих логов и просто file для бинарного доступа
То же самое...
EOF и FileSize - это 2 разные вещи. Пояни про что ты говоришь.
Конечно разные, я к тому что если использовать текстовый файл, то для проверки конца обычно используеться EOF, а в типизированных используют текущую позицию в файле и проверяют равна ли она FileSize.
Oleg_Z прав. В общем случае EOF работает примерно так:
1) temp = FilePos;
2) size = Seek(end);
3) Seek(temp)
4) eof:=temp=size;
Ну, фигурально выражаясь. Под DOS пункты 1..3 выполняются одной и той же функцией. Единственное на яём может произойти экономия времени - на пункте 1, но я не помню хранится ли текущий указатель в переменной типа File. Судя по тому, что скорость падает в 2 раза, то храниться
Кстати, а мне кажется есть хороший способ ускорить процедуру EOF .
Поробую ...
=== добавил позже, подумав ===
Нельзя никак укорить эту функцию. Где-то прога хранит текущий указатель. Вот если найти где и как она хранит его ...
Почитай доку по переменной типа File. Точно в одном из его полей храниться.
У переменной типа FILE есть поля?????
Или я того ...
Ты не того.
Что такое File? эЭто что, что-то типа Integer или Double? Нифига. Это структура, которая хранит в себе кучу инфы (не спроста она столько памяти кушает). В "Азах" я рассказывал про Dos.TextRec. Наверняка что-то есть и для "просто File", если не то же самое.
{ Typed-file and untyped-file record }
FileRec = record
Handle: Word;
Mode: Word;
RecSize: Word;
Private: array[1..26] of Byte;
UserData: array[1..16] of Byte;
Name: array[0..79] of Char;
end;
{ Textfile record }
TextBuf = array[0..127] of Char;
TextRec = record
Handle: Word;
Mode: Word;
BufSize: Word;
Private: Word;
BufPos: Word;
BufEnd: Word;
BufPtr: ^TextBuf;
OpenFunc: Pointer;
InOutFunc: Pointer;
FlushFunc: Pointer;
CloseFunc: Pointer;
UserData: array[1..16] of Byte;
Name: array[0..79] of Char;
Buffer: TextBuf;
end;
Ну, судя по всему где-то в Private или UserData и лежит. Это продебугить надо...
Надо -же я открыл для себя новою инфу. Правильно сказанно - учиться, учиться, учиться, и так далее
Надо поэксперементировать с FILE.
Вот на счет FILE здесь, Oleg_Z, ты правильно сказал.
Нечего над ним опыты ставить.
Проще самому написать под INT 21h - вот тебе по 2 (!) байта на файловую переменную.
Народ, почаще заглядывайте в исходники модулей ТП...
Это взято из модуля DOS.PAS
Oleg_Z:
А лучше вообще не страдай фигнёй, а займись написанием какой-то игры.
В таком случае скорость работы с файлом - очень важная штука.