Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Работая с текстовым файлом   Найти похожие ветки 

 
ИМХО ©   (2004-11-21 16:42) [0]

Как узнать текущую позицию?

Ситуация такова: читается текстовый файл от начала и до самого конца (с помощью ReadLn).

Нужно "запоминать" определенные места (начало и конец блока), чтобы затем быстро обращаться к ним.

Как это осуществить?


 
Anatoly Podgoretsky ©   (2004-11-21 16:48) [1]

Считай или байты или строки, а насчет быстро, текстовый файл это устройство последовательного доступа.


 
ИМХО ©   (2004-11-21 16:54) [2]

я считаю байты:

Sum := Sum + Length(Str) + 2;

чтобы затем обратиться так

 MyStream := TFileStream.Create(FName, fmOpenRead or
   fmShareDenyNone);
 try
   MyStream.Position := Start_Index;
   SetLength(MessageStr, Finish_Index);
   MyStream.Read(MessageStr[1], Finish_Index);
 finally
   MyStream.Free;
 end;

ДЛЯ НЕКОТОРЫХ ФАЙЛОВ ЭТОТ МЕТОД НЕ КАТИТ!


 
ИМХО ©   (2004-11-21 16:56) [3]

для некоторых файлов по какой-то неведомой причине счетчик накручивает больше байтов, чем есть, поэтому MessageStr получается не тот, что надо


 
ИМХО ©   (2004-11-21 16:58) [4]

"Что делать?" (с) Чернышевский


 
ИМХО ©   (2004-11-21 17:01) [5]

допустим, стою я на 100-й строке.
Как определить смещение первого символа этой строки относительно начала файла???


 
Anatoly Podgoretsky ©   (2004-11-21 17:01) [6]

ИМХО ©   (21.11.04 16:54) [2]
Это уже не текстовые файлы, а VCL обвязка над низкоуровневым АПИ работы с двоичными данными, для работы как с текстовыми файлам тебе придется поверх ее реализовать всю функциональность ReadLn


 
ИМХО ©   (2004-11-21 17:08) [7]

но почему по формуле

Sum := Sum + Length(Str) + 2

кол-во байтов считается неверно???


 
ИМХО ©   (2004-11-21 17:10) [8]

ставим так вопрос:
как при последовательном чтении текстового файла с использованием ReadLn ПРАВИЛЬНО подсчитать количество байтов?


 
Anatoly Podgoretsky ©   (2004-11-21 17:15) [9]

ИМХО ©   (21.11.04 17:08) [7]
А почему по этой формуле должно считаться верно?

ИМХО ©   (21.11.04 17:10) [8]
Сумма длин строк + неопределенный разделитель строк, если файл верный ,то +1 или 2 в зависимости от системы, только для строковых файлов это не верно, у них единица информации строка, а не байт.


 
ИМХО ©   (2004-11-21 17:20) [10]


> ИМХО ©   (21.11.04 17:08) [7]
> А почему по этой формуле должно считаться верно?


мне ее Панов давал как-то...


> Сумма длин строк + неопределенный разделитель строк, если
> файл верный


что значит верный?


> зависимости от системы


ось - всегда Винды


 
ИМХО ©   (2004-11-21 17:23) [11]

то есть предлагается запоминать номер строки начала блока, номер строки конца блока, затем КАЖДЫЙ раз открывать файл и читать ReadLn ДО ПОБЕДНОГО?

Жутко неэффективно.


 
KilkennyCat ©   (2004-11-21 17:23) [12]

синхронизировав TstringList со свои текстовым файлом ты получишь желаемое удобство и скорость (в зависимости от частоты синхронизации)


 
ИМХО ©   (2004-11-21 17:28) [13]


> KilkennyCat ©   (21.11.04 17:23) [12]


можно подробнее о синхронизации?


 
Anatoly Podgoretsky ©   (2004-11-21 17:36) [14]

ИМХО ©   (21.11.04 17:20) [10]
Во первых если тебе нужна скорость и позионируемость, то загрузи файл в список.

Верный это когда разделитель соответствует системе, а не дика смесь из разных разделителей, например #13#10#10


 
KilkennyCat ©   (2004-11-21 17:38) [15]

TstringList.LoadFromFile - в общем случае, каждый раз, когда изменится файл. Но можно продумать и более удобный вариант, когда меняться будет только измененное...


 
Anatoly Podgoretsky ©   (2004-11-21 17:42) [16]

ИМХО ©   (21.11.04 17:23) [11]
Ну если уж быть совсем строгим, то вообще только один раз в одном направлении, поскольку это может быть последовательный коммуникационный файл, например COM порт, что ты там будешь открывать заново? А это и есть именно определение чистого текстового файла - последовательный, со строками заранее неизвестной длины, разграниченные разделителем, и кончом файла является специальный символ конец файла. В случае файла расположеного на диске просто действует небольшое отклонение от нормы, конец можно определить по размеру, но это чисто частный случай.

Вся твоя проблема, что ты выбираешь не те средства и алгоритмы для выполнения какой то работы. Список наиболее подходящий алгоритм. При определенной заточке можно работать и с файлами очень большой длины. Просто надо определить позиции кусков пройдясь один раз по файлу, можно в процессе работы и далее работать как с двоичным файлом, но закачивая его в список. Путей впрочем значительно больше.


 
ИМХО ©   (2004-11-21 17:50) [17]


> Anatoly Podgoretsky ©   (21.11.04 17:42) [16]
> Вся твоя проблема, что ты выбираешь не те средства и алгоритмы
> для выполнения какой то работы. Список наиболее подходящий
> алгоритм.


то есть предлагаешь использовать все-таки TStringList?
файл какого размера он может удержать в памяти? (берем слабенькую машину)


 
KilkennyCat ©   (2004-11-21 17:52) [18]


> ИМХО ©   (21.11.04 17:50) [17]


зависит от типа ОС, объема памяти-винчестера, фата...


 
Anatoly Podgoretsky ©   (2004-11-21 17:52) [19]

Не предлагаю, а показываю как один из вариантов, на основании твоего разъяснения, которое далеко не полное. Все определяется задачей, но уверен, что это решит проблему скорости, добавления, удаление строк практически на 100%, только при больших размерах стоит задуматься, но это действительно при больших размерах, скажем свыше 10/100 мб на файл.


 
KilkennyCat ©   (2004-11-21 17:54) [20]

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


 
KilkennyCat ©   (2004-11-21 17:56) [21]

С другой стороны, я делал для слабых машин загрузку почти 30 метров в стринглист. пришлость сделать заставку :) зато потом работало шустро.


 
ИМХО ©   (2004-11-21 18:15) [22]


> Anatoly Podgoretsky ©   (21.11.04 17:15) [9]
> Сумма длин строк + неопределенный разделитель строк, если
> файл верный ,то +1 или 2 в зависимости от системы, только
> для строковых файлов это не верно, у них единица информации
> строка, а не байт.


ВОТ!!!

Выяснилось, что некоторые строки в этих [skipped] файлах заканчивались только на #13, а не на #13#10, а я ко всем приплюсовываю 2!

Но как это узнать программно (без лазания по всему файлу шестнадцатиричном редактором)?

ReadLn не может сказать, чем заканчивается текстовый файл: #13 или #13#10 ???


 
KilkennyCat ©   (2004-11-21 18:18) [23]

нет.


 
ИМХО ©   (2004-11-21 18:43) [24]

кто может это сказать?


 
Anatoly Podgoretsky ©   (2004-11-21 19:03) [25]

ИМХО ©   (21.11.04 18:15) [22]
Никак, вот если бы это был Д5 тогда было бы одназначно, а начиная с Д6 борланд поше на поводу у некоторыех, теперь абсолютно неясно как и ксолько.


 
KilkennyCat ©   (2004-11-21 19:04) [26]


> Anatoly Podgoretsky ©   (21.11.04 19:03) [25]


ну почему же ни как, ежели программно?


 
Anatoly Podgoretsky ©   (2004-11-21 19:06) [27]

KilkennyCat ©   (21.11.04 19:04) [26]
Через ReadLn, а именно о нем вопрос, никак. А другие методы это уже не из текстовых файлов.


 
GuAV ©   (2004-11-21 21:52) [28]

TTextRec type



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.041 c
1-1101120518
#Master#
2004-11-22 13:48
2004.12.05
Чтение из текстового файла


14-1100598102
sweetk
2004-11-16 12:41
2004.12.05
Как обойти дст?


1-1100766513
Chery
2004-11-18 11:28
2004.12.05
Клиент не работает под WinXP . Cервер- Midas, Socket.


14-1100171946
Sash
2004-11-11 14:19
2004.12.05
IE(cgi-bin)


4-1098200620
crio
2004-10-19 19:43
2004.12.05
Работа со сканером