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

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

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

3 страниц V < 1 2 3 >  
 Ответить  Открыть новую тему 
> Файлы
сообщение
Сообщение #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.

Должно вывести две одинаковые тройки строчек.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


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

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

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


Да, что-то я стормозил. (с кем не бывает)
Если файл уже открыт, то он сначала закрывается, а затем вновь
открывается. Текущая позиция указателя устанавливается на
начало файла.
А вот если надо на произвольные элемент переместить, то не выйдет с текстовыми.


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


Гость






Я бы тоже не был так уверен...
Текстовый файл по сути своей запись типа TextRec (см. в "АЗЫ", я там о ней упоминал). Вот оттуда можно взять и вытянуть Handle файла (см. свой недавний вопрос), а затем уже дёргать указатель куда захочешь. Проблема только в том, что для установки на 30-ую строку придётся считать ещё 29 sad.gif Но доступ к n-ному символу осуществляется моментом smile.gif



Ладно, ладно - согласен, извращенец... Ну и что...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


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

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

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


Цитата
Ладно, ладно - согласен, извращенец... Ну и что...

Я бы так не сказал, это между прочим есть оптимизация, т.к. это будет быстрее, чем закрывать файл, открывать заново, и заводив переменную, отсчитывать на n элемент.

Кстати, а что будет, если текстовый файл описать как File of string?
Надо попробовать ...


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


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


Смотрю...
*****

Группа: Пользователи
Сообщений: 1 055
Пол: Мужской
Реальное имя: Пшеничный Алексей Анатольевич

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


Может поиграться с "file of char;"?


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


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

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

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


Попробовать можно ...
Только потеряются особенности текстового ("строчность" )


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


Гость






Не так уж и сложно написать что-нибудь типа Function GetString(F:TCharFile):String):String...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


Новичок
*

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

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


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


Знаток
****

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

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


Stream, обоснуй.


--------------------
Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


Знаток
****

Группа: Пользователи
Сообщений: 419
Пол: Мужской

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


romtek
ну конечно не в тысячу ,но так как типизированный файл имеет некую гипотетическую структуру ,то процедура чтения как-то её анализирует.
если ты сам будешь считывать файл как символьный ,а потом решать что там к чему в нем и нет ли ошибки ,то получается что дольше.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #33


Гость






Бред.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


Бывалый
***

Группа: Пользователи
Сообщений: 180
Пол: Мужской

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


точно бред, никакой проверки на корректность данных при типизированном чтении не происходит (имхо), а так как данные считываются блоками, будет еще быстрее, чем из текстового (там же каждый символ надо анализировать на конец строки)

впрочем, всякое может быть, я ни разу (!) в своей практике не использовал типизированные файловые переменные, только text (textfile в дельфе) для ведения всяческих логов и просто file для бинарного доступа
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #35


Гость






То же самое...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


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

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

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


Цитата
А вы в курсе, что в типизированном файле чтение происходит в тыщу раз медленнее, чем в техтовом...

Это бред!
Если на то пошло, то наоборот, процедуры для текстовых файлов работают медленнее процедур для типизированных и не типизированных.
Пример:
EOF работает в 2 раза медленнее, чем FileSize( при правильном использовании).


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


Гость






EOF и FileSize - это 2 разные вещи. Пояни про что ты говоришь.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #38


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

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

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


Конечно разные, я к тому что если использовать текстовый файл, то для проверки конца обычно используеться EOF, а в типизированных используют текущую позицию в файле и проверяют равна ли она FileSize.


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


Гость






Oleg_Z прав. В общем случае EOF работает примерно так:
1) temp = FilePos;
2) size = Seek(end);
3) Seek(temp)
4) eof:=temp=size;
Ну, фигурально выражаясь. Под DOS пункты 1..3 выполняются одной и той же функцией. Единственное на яём может произойти экономия времени - на пункте 1, но я не помню хранится ли текущий указатель в переменной типа File. Судя по тому, что скорость падает в 2 раза, то храниться smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #40


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

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

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


Кстати, а мне кажется есть хороший способ ускорить процедуру EOF .
Поробую ...

=== добавил позже, подумав smile.gif ===
Нельзя никак укорить эту функцию. Где-то прога хранит текущий указатель. Вот если найти где и как она хранит его ...

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


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

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

 





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