Galkov писал(а):
Про разбиение строки на части по-позже обсудим...Сколько символов содержит перевод строки, вопрос запутанный до безобразия. И поэтому, зависит от "производителя"
Объектная библиотека (TStream.ReadStr) предполагает 5 вариантов "окончания строки", которые безусловно выдергиваются из файла: <EOF>, #0, #10, #13#10, и одиночный #13 (если после #13 не идет символ #10)
В винде обычно это два символа #13#10, и, записывая, мы именно эти два символа и вставляем.
А кодировка UTF-8 может кодировать один символ -- до 6-ти байт. Хотя русским буквам достаточно и двух. А для UTF-16 будет достаточно и трех байт.
В этом деле главное, что больше одного, и никто не обещал, что они не будут разрезаны на части левым краем проекции. Который всеобязательно кратен 64К (так пожелал nesco).
Мои соображения по этому поводу заключаются в следующем.
Если мы можем ограничить длину строки для парсинга (например, 1 метром), тогда мы могли бы размер проекции сделать с запасом (5 метров), а в цикле менять Offset по прежнему на 4 метра.
Строка выскочила за 4-х метровую границу - заканчиваем с этой проекцией, и делаем следующую.
Но эту последнюю (выскочившую) строку мы прочитали верно (если она не длиннее нашего запаса)
Правда, на следующей проекции мы должны переустановить позицию стрима на размер этого "выскока"
((ИБО, прибавить по простому Stream.Position к SharedStream.FileOffset - не получится, в связи с вышеупомянутыми "особенностями округления"))
Например, таким образом:
Пример проекции "с метровым запасом"
Add(Hub,2606912,147,161)
{
OutCount=4
link(onEvent1,12714162:doClear,[(172,167)(172,69)])
link(onEvent2,6449920:doClear,[])
link(onEvent3,12437222:doOpen,[(270,181)(270,237)])
link(onEvent4,12675296:doRepeat,[(172,188)(172,230)])
}
Add(SharedStream,12437222,329,231)
{
PageMem=1280
Point(FileSize)
Point(FileOffset)
link(Offset,6449920:Result,[])
AddHint(24,-20,39,13,PageMem)
}
Add(Math,6449920,343,161)
{
Op2=4194304
Point(doClear)
link(onResult,13850635:doCalc,[])
link(Op1,12437222:FileOffset,[(349,152)(384,152)(384,271)(363,271)])
AddHint(7,-35,66,13,Op2)
}
Add(Charset,786843,532,49)
{
Type=7
link(onCharset,7154492:doWork,[])
}
Add(Button,2506679,49,161)
{
Left=14
Top=14
link(onClick,9843132:doExecute,[])
}
Add(ProgressBar,9114966,532,126)
{
Left=82
Top=14
Width=525
}
Add(MathParse,13850635,399,161)
{
MathStr="%2 * 100 / %1"
ResultType=0
link(onResult,15947962:doEvent1,[])
link(X1,12437222:FileSize,[(405,152)(391,152)(391,278)(356,278)])
}
Add(Hub,15947962,490,161)
{
link(onEvent1,9114966:doPosition,[(515,167)(515,132)])
link(onEvent2,7791365:doCaption,[])
}
Add(ODialog,9843132,98,161)
{
link(onExecute,2606912:doEvent1,[])
}
Add(Application,12592788,266,245)
{
Wait=1
Point(onTerminate)
link(onTerminate,12675296:doStop,[(305,251)(305,286)(172,286)(172,237)])
}
Add(Repeat,12675296,182,224)
{
Type=4
Op2=Integer(100)
Check=1
link(onRepeat,894652:doEvent1,[])
link(Op1,13850635:Result,[(188,208)(405,208)])
}
Add(Hub,894652,231,224)
{
OutCount=4
link(onEvent1,12018389:doEvent1,[(256,230)(256,48)])
link(onEvent2,6449920:doOperation,[(263,237)(263,167)])
link(onEvent3,12437222:doRemapping,[])
link(onEvent4,12592788:doProcessMessages,[])
}
Add(LineBreakEx,7154492,581,49)
{
Caption="Enum_Lines"
}
Add(MainForm,7791365,532,168)
{
Left=20
Top=105
Width=641
Height=90
Caption="FileMapVewer"
Position=1
Point(onClose)
}
Add(Repeat,2979535,364,49)
{
Type=1
Op2=Real(4194304)
link(onRepeat,16078775:doCompare,[])
link(Op1,9541802:Var2,[])
AddHint(8,-37,66,13,Op2)
}
Add(Hub,12018389,266,42)
{
OutCount=3
link(onEvent1,2128108:doData,[(291,48)(291,104)])
link(onEvent2,2979535:doRepeat,[])
link(onEvent3,12714162:doOperation,[])
}
Add(Math,12714162,308,56)
{
OpType=1
Op2=4194304
Point(doClear)
link(Op1,9541802:Var1,[(314,33)])
AddHint(-21,-44,66,13,Op2)
}
Add(GetDataEx,9541802,364,28)
{
Angle=1
link(Data,12838482:Var1,[])
}
Add(DoData,2128108,308,98)
{
link(onEventData,1906853:doPosition,[(473,104)(473,69)])
link(Data,12714162:Result,[])
}
Add(If_else,16078775,413,49)
{
Type=1
link(onTrue,1906853:doGet,[(473,55)(473,62)])
link(onFalse,2979535:doStop,[(452,62)(452,90)(354,90)(354,62)])
link(Op1,12838482:Var2,[])
link(Op2,12437222:SizeMMF,[(426,40)(461,40)(461,285)(349,285)])
}
Add(GetDataEx,12838482,413,28)
{
Angle=1
link(Data,1906853:Position,[(503,33)(503,89)(496,89)])
}
Add(DataToFile,1906853,483,49)
{
Type=7
Point(Position)
Point(doPosition)
link(onGet,786843:doCharset,[])
link(Stream,12437222:Stream,[(489,40)(468,40)(468,292)(335,292)])
}