IPB
ЛогинПароль:

> Правила раздела!

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

3 страниц V  1 2 3 >  
 Ответить  Открыть новую тему 
> Файлы
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 15

Репутация: -  0  +


Здравствуйте.
Нужна помощь... Как открыть файл, не зная его имя (задан только каталог, где находится)...
Заранее спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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)

Примечание:
Если файл текстовый, то открыть его таким образом можно только на чтение, или только на дозапись.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 15

Репутация: -  0  +


Большое спасибо...
Кстати, у меня последний случай...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Пожалуйста smile.gif
В вашем случае (перебор всех файлов) можно использовать (нужно т.е.) цикл:
Код
{...}
findfirst( {...}
{...}
repeat
 findnext( {...}
 {...}
until DosError=18;
{...}


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 15

Репутация: -  0  +


FindFirst('*.TXT', AnyFile, A); ---> "Type mismatch"
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Так стоп. Значит вы не правильно описали переменную A.
Покажите весь код (или хотя-бы ту часть, где переменные описываются и модули подключаются.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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):
Да и еще... Какой командой табуляцию вызвать?...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Так, я понял, что первая проблемма с несовместимостью типов разрешена.
Эта ошибка могла быть по 3 причинам:
  • Вы находились в режиме отладки и надо было нажать RUN-> Program Reset
  • Надо было скомпилировать заново программу в память
  • неизвестная причина smile.gif
Файл на дозапись можно открыть процедурой append(f).
Процедуры для табуляции нет, но можно легко написать, просто записываем сначала нужное количество пробелов:
Код

var
i:byte;
f:text;
{...}
begin
for i:=1 to нужное_колическтво_пробелов do write(f,' ');
{...}

Не забываем, что writeln записывает в файл и переводит на новую строку,
а write просто пишет.
Я вообще никогда не пользуюсь writeln, а заменяю на альтернативную:
write('dfdsfdgsdfgsgsdgsd',#13,#10);
P.S.
Кстати, это же оптимизация .... пойду куда надо сообщу!


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 15

Репутация: -  0  +


Скорее третья причина... А каким образом в типизированном файле перейти на следующую строку?... А на счет табуляции, с пробелами не получится, выравнивать текст разной длины...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Цитата
Скорее третья причина...

Естественно ... :p5:
Цитата
А каким образом в типизированном файле перейти на следующую строку?...

Ой, кошмар какой! В типизированных файлах нет строк!
Там есть только элементы файла
Тут два случая:




  • При записи, переход на следующий эл-т осуществляесть автоматически



  • При чтении, переход осуществляется процедурой seek(f,n), где f -файловая переменная, а n- номер элемента, на который надо перейти.




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

Стоп, стоп, стоп!
Мы значит говорим о разных вещах.
Табуляция - это отступ от левого края на n символов.
А вы что под этим понимаете?

Сообщение отредактировано: Oleg_Z -


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Табуляция, насколько я помню, Олег, это выравнивание под определённую длинну, а не отступ, тем более от какого-то конкретного края.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Ага, понял ,это у меня ассоциация табуляции и клавиши TAB smile.gif Хотя выравнивание ИМХО называется форматирование текста.
Ну текст можно выравнить несколькими способами:
  • читаем из файла строку, если длинная, то остаток помещаем в буфер, потом читаем следующую, сразу в начало пишем из буфера, и проверяем длинну, ну и т.д (а если считываемая строка короткая, то добавляем пробелы)
  • Посимвольно перезаписываем файл, исключая символы управления (#13, #10), а потом, опять перезаписываем, только вставляя их куда надо.


Сообщение отредактировано: Oleg_Z -


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 15

Репутация: -  0  +


Такой еще вопрос: Создан ЕХЕ файл, при запуске которого идет обработка текстовых файлов... Как сделать, чтобы программа обрабатывала всегда только те файлы, которые лежат в ее каталоге, при этом местоположение ЕХЕ файла меняется?. Т.е. кинули в любую папку - запустили - обработала те файлы которые лежат в этой папке...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


При связывании файла, надо не указывать полный путь к файлу, а только имя:
т.е. не так:
assign(f,'C:\windows\sss.txt');
А так:
assign(f,'sss.txt');
---------
Процедуры FindFirst и FindNext ищут файл в текущем каталоге.
Текущий каталог в программе - тот, в котором находиться эта прога.

Можно сменить текущий каталог процедурой CHDIR('каталог');


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 15

Репутация: -  0  +


Хорошо, а почему она обрабатывает только 10 файлов? Когда в каталоге 31...

Добавлено (19.06.04 4:28):
И еще... Где можно найти КОД процедупы READ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


2 причины:
1. Вы их 10 одновременно открываете.
(странно, тогда должно быть ограничение - 14 файлов )
2. Другие файлы не подходят по условию поиска (FindFirst)
может у остальных другое расширение или еще что.

А код выложить не можете?

Добавлено (19.06.04 4:39):
Цитата(Unreal)
Где можно найти КОД процедуры READ

Зачем??? blink.gif
Там-же чистый асм.
Если хотите заменить на более скоростную, то используйте BlockRead, только файл уже используйте нетипизированный.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Новичок
*

Группа: Пользователи
Сообщений: 15

Репутация: -  0  +


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

Добавлено (19.06.04 8:37):
И возможно ли, во время работы в текстовом файле, вернуть курсор в начало файла?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Открыть текстовый файл одновременно для чтения и записи нельзя.
У меня была программка для чтения файла в память, там с ним можно делать все что угодно, а потом снова записывать на диск, могу ее поискать если надо.
Цитата
И возможно ли, во время работы в текстовом файле, вернуть курсор в начало файла?

Нет, не возможно. В этом недостаток текстовых файлов.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






Oleg_Z, а Reset(TextoviyFile) что сделает?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 15

Репутация: -  0  +


-> BlackShadow... Если можно подробнее...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

3 страниц V  1 2 3 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.04.2024 16:09
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name