Здравствуйте.
Нужна помощь... Как открыть файл, не зная его имя (задан только каталог, где находится)...
Заранее спасибо.
Файлы |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Файлы |
Unreal |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 15 Репутация: 0 |
Здравствуйте.
Нужна помощь... Как открыть файл, не зная его имя (задан только каталог, где находится)... Заранее спасибо. |
Altair |
Сообщение
#2
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Какие-то данные о файле все же нужны.
Открыть его можно, в следующих случаях:
FindFirst и в некоторых случаях FindNext. Обе они находятся в модуле DOS. То есть для их использования, подключаем его: Код Uses Dos, {... другие модули}; {...} Вызывается процедура следующим образом: в разделе переменных, надо описать переменную, с типом SearchRec Например: Код Uses DOS; {...}Var A: SearchRec; {... другие переменные} Теперь в программе мы можем вызвать процедуру FindFirst: Код {...} Begin FindFirst('*.TXT',AnyFile,A); {...} end. Поясняю: Мы ищем ПЕРВЫЙ файл с расширением TXT в текущем каталоге, который может иметь любые(AnyFile) атрибуты. Данные о файле (если он найден), помещаются в переменную A (она имеет тип SearchRec). Тип SearchRec имеет следующую структуру: Код Type SearchRec = Record Fill : Array [1..21] Of Byte; Attr : Byte; Time : Longint; Size : Longint; Name : Array [0..12] Of Char; End; Если файл не найден, то в переменную DosError помещается код ошибки 18 (нет больше файлов). Если нам надо продолжить поиск (какие-то условия нас не устраивают), то мы вызываем процедуру FindNext ... Но для ее вызова уже не надо указывать тип искомых файлов( их маску и атрибуты). Процедура FindNext вызывается всегда только после FindFirst. Теперь, когда нужный файл найден: Код { связываем файловую переменную с именем этого файла } Assign (f,a.name); { и открываем его } Reset(f) Примечание: Если файл текстовый, то открыть его таким образом можно только на чтение, или только на дозапись. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Unreal |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 15 Репутация: 0 |
Большое спасибо...
Кстати, у меня последний случай... |
Altair |
Сообщение
#4
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Пожалуйста
В вашем случае (перебор всех файлов) можно использовать (нужно т.е.) цикл: Код {...} findfirst( {...} {...} repeat findnext( {...} {...} until DosError=18; {...} -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Unreal |
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 15 Репутация: 0 |
FindFirst('*.TXT', AnyFile, A); ---> "Type mismatch"
|
Altair |
Сообщение
#6
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Так стоп. Значит вы не правильно описали переменную A.
Покажите весь код (или хотя-бы ту часть, где переменные описываются и модули подключаются. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Unreal |
Сообщение
#7
|
Новичок Группа: Пользователи Сообщений: 15 Репутация: 0 |
Что там могло быть не правильно, я не осознал... Но к вечеру, прошу заметить, ЗАГРУЗИВ СВОЙ "НЕ РАБОТАЮЩИЙ" КОД, все прекрасно заработало...
Появился еще один вопрос, возможно ли открыть текстовой файл для продолжения записи, не стирая данные, как это делает ReWrite? И не прибегая к типизированным и нетипизированным файлам... Код Uses DOS; Type SearchRec = Record Fill:Array [1..21] of Byte; Attr:Byte; Time:Longint; Size:Longint; Name:Array [0..12] of Char; end; Var a:SearchRec; f:Text; n:Integer; Begin FindFirst('*.TXT',AnyFile, a); Assign (f,a.name); Reset(f); ReadLn(f,n); WriteLn(n); end. Добавлено (17.06.04 11:51): Да и еще... Какой командой табуляцию вызвать?... |
Altair |
Сообщение
#8
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Так, я понял, что первая проблемма с несовместимостью типов разрешена.
Эта ошибка могла быть по 3 причинам:
Процедуры для табуляции нет, но можно легко написать, просто записываем сначала нужное количество пробелов: Код var i:byte; f:text; {...} begin for i:=1 to нужное_колическтво_пробелов do write(f,' '); {...} Не забываем, что writeln записывает в файл и переводит на новую строку, а write просто пишет. Я вообще никогда не пользуюсь writeln, а заменяю на альтернативную: write('dfdsfdgsdfgsgsdgsd',#13,#10); P.S. Кстати, это же оптимизация .... пойду куда надо сообщу! -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Unreal |
Сообщение
#9
|
Новичок Группа: Пользователи Сообщений: 15 Репутация: 0 |
Скорее третья причина... А каким образом в типизированном файле перейти на следующую строку?... А на счет табуляции, с пробелами не получится, выравнивать текст разной длины...
|
Altair |
Сообщение
#10
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Цитата Скорее третья причина... Естественно ... :p5: Цитата А каким образом в типизированном файле перейти на следующую строку?... Ой, кошмар какой! В типизированных файлах нет строк! Там есть только элементы файла Тут два случая:
Цитата А на счет табуляции, с пробелами не получится, выравнивать текст разной длины... Стоп, стоп, стоп! Мы значит говорим о разных вещах. Табуляция - это отступ от левого края на n символов. А вы что под этим понимаете? Сообщение отредактировано: Oleg_Z - -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
BlackShadow |
Сообщение
#11
|
Гость |
Табуляция, насколько я помню, Олег, это выравнивание под определённую длинну, а не отступ, тем более от какого-то конкретного края.
|
Altair |
Сообщение
#12
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Ага, понял ,это у меня ассоциация табуляции и клавиши TAB Хотя выравнивание ИМХО называется форматирование текста.
Ну текст можно выравнить несколькими способами:
Сообщение отредактировано: Oleg_Z - -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Unreal |
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 15 Репутация: 0 |
Такой еще вопрос: Создан ЕХЕ файл, при запуске которого идет обработка текстовых файлов... Как сделать, чтобы программа обрабатывала всегда только те файлы, которые лежат в ее каталоге, при этом местоположение ЕХЕ файла меняется?. Т.е. кинули в любую папку - запустили - обработала те файлы которые лежат в этой папке...
|
Altair |
Сообщение
#14
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
При связывании файла, надо не указывать полный путь к файлу, а только имя:
т.е. не так: assign(f,'C:\windows\sss.txt'); А так: assign(f,'sss.txt'); --------- Процедуры FindFirst и FindNext ищут файл в текущем каталоге. Текущий каталог в программе - тот, в котором находиться эта прога. Можно сменить текущий каталог процедурой CHDIR('каталог'); -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Unreal |
Сообщение
#15
|
Новичок Группа: Пользователи Сообщений: 15 Репутация: 0 |
Хорошо, а почему она обрабатывает только 10 файлов? Когда в каталоге 31...
Добавлено (19.06.04 4:28): И еще... Где можно найти КОД процедупы READ? |
Altair |
Сообщение
#16
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
2 причины:
1. Вы их 10 одновременно открываете. (странно, тогда должно быть ограничение - 14 файлов ) 2. Другие файлы не подходят по условию поиска (FindFirst) может у остальных другое расширение или еще что. А код выложить не можете? Добавлено (19.06.04 4:39): Цитата(Unreal) Где можно найти КОД процедуры READ Зачем??? Там-же чистый асм. Если хотите заменить на более скоростную, то используйте BlockRead, только файл уже используйте нетипизированный. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Unreal |
Сообщение
#17
|
Новичок Группа: Пользователи Сообщений: 15 Репутация: 0 |
Есть ли процедура, с помощью которой текстовой файл можно открыть и для записи и для чтения, одновременно...?
Добавлено (19.06.04 8:37): И возможно ли, во время работы в текстовом файле, вернуть курсор в начало файла? |
Altair |
Сообщение
#18
|
Ищущий истину Группа: Пользователи Сообщений: 4 825 Пол: Мужской Реальное имя: Олег Репутация: 45 |
Открыть текстовый файл одновременно для чтения и записи нельзя.
У меня была программка для чтения файла в память, там с ним можно делать все что угодно, а потом снова записывать на диск, могу ее поискать если надо. Цитата И возможно ли, во время работы в текстовом файле, вернуть курсор в начало файла? Нет, не возможно. В этом недостаток текстовых файлов. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
BlackShadow |
Сообщение
#19
|
Гость |
Oleg_Z, а Reset(TextoviyFile) что сделает?
|
Unreal |
Сообщение
#20
|
Новичок Группа: Пользователи Сообщений: 15 Репутация: 0 |
-> BlackShadow... Если можно подробнее...
|
Текстовая версия | 11.01.2025 16:44 |