Пишу консольное приложение на Lazarus 1.0.8, FPC 2.6.2, ОS Ubuntu x64.
Считываю длинные строки из файла. Длина очень длинных строк всегда равна 9999 символов. И Length и UTF8Length. Пробовал из TSTringList.LoadFromStream - то же самое.
Копаю и не могу понять в чём проблема. Кстати, например, Trim и Delete прекрасно работают со строкой.
Длина строки = 9999
Модератор: Модераторы
Тест:
У меня размер считанной из файла строки правильно показывается, а у Вас?
Код: Выделить всё
Program p1;
var
f: TextFile;
i: Integer;
Begin
Assign(f, '1.txt');
Rewrite(f);
For i:=0 To 12000 Do
Write(f, 'a');
CloseFile(f);
End.Код: Выделить всё
{$H+}
Program p2;
Var
f: TextFile;
s: string;
Begin
AssignFile(f, '1.txt');
Reset(f);
ReadLn(f, s);
WriteLn(Length(s));
CloseFile(f);
End.У меня размер считанной из файла строки правильно показывается, а у Вас?
Vadim, блин, и вправду, скомпилировал FPC, показывает 12001. Что-то с настройками в Lazarus... Сам в шоке, копаюсь.
Добавлено спустя 3 минуты 40 секунд:
Вот моя программка, для разбития длинных строк из дампа MySQL на серваке, чтобы импортировать их у себя на компе в другую версию. Показывает на длинных строках 9999.
Добавлено спустя 3 минуты 40 секунд:
Вот моя программка, для разбития длинных строк из дампа MySQL на серваке, чтобы импортировать их у себя на компе в другую версию. Показывает на длинных строках 9999.
Код: Выделить всё
program dumpcvt;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp, LCLProc
{ you can add units after this };
type
{ TMyApplication }
TMyApplication = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
{ TMyApplication }
procedure TMyApplication.DoRun;
var
ErrorMsg: String;
S1, S2 :TStringList;
i, j, c,
Len, MaxCount :int64; {QWORD;}
s, op :string;
F1, F2 :TextFile;
begin
// quick check parameters
ErrorMsg:=CheckOptions('hs','help');
if ErrorMsg<>'' then
begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if HasOption('h','help') then
begin
WriteHelp;
Terminate;
Exit;
end;
// parse parameters
if HasOption('s') then
begin
try
MaxCount:=StrToInt(GetOptionValue('s'))
except
writeln('ÐÑибка в опÑии -s');
Terminate;
end;
writeln('ÐÑполÑзÑÑ Ð¼Ð°ÐºÑималÑное колиÑеÑÑво запиÑей: ', MaxCount);
end
else
MaxCount:=1000;
{ add your program here }
AssignFile(F1, Params[ParamCount]);
AssignFile(F2, 'out.sql');
Reset(F1);
Rewrite(F2);
while not EOF(F1) do
begin
readln(F1, s);
Len:={UTF8}Length(s);
writeln(Len);
end;
CloseFile(F1);
CloseFile(F2);
//writeln('Length: ', Len);
//readln;
//for i:=1 to Len do
// write(s[i]);
{ S1:=TStringList.Create;
S1.LoadFromFile(Params[ParamCount]);
S2:=TStringList.Create;
i:=0;
while i<S1.Count do
begin
s:=TrimRight(S1.Strings[i]);
if Pos('INSERT INTO', s)=1 then
begin
op:=Copy(s, 1, Pos('(', s)-1); //опеÑаÑÐ¾Ñ SQL
Delete(s, 1, Length(op));
op:=op+' '; //еÑли вдÑÑг где-Ñо Ð½ÐµÑ Ð¿Ñобела Ð¼ÐµÐ¶Ð´Ñ VALUES_(
//Ñикл Ñазбивки
while s<>'' do
begin
Len:={UTF8}Length(s);
j:=0; //ÑекÑÑÐ°Ñ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ Ð² ÑÑÑоке
c:=0; //колиÑеÑÑво )
MaxCount:=1;
while (c<MaxCount) and (j<Len) do
begin
inc(j);
while ({UTF8Copy(s, j, 1)}s[j]<>')') and (j<Len) do
inc(j);
if j<>Len then
begin
inc(c);
end;
end;
if j<>Len then
S2.Add(op+{UTF8}Copy(s, 1, j)+';')
else
S2.Add(op+s); //конеÑ
write('.');
{UTF8}Delete(s, 1, j+1); //j+1 иÑклÑÑаем запÑÑÑÑ
end;
end
else
S2.Add(s);
writeln(IntToStr(i), ': done');
// S2.SaveToFile('out.sql');
inc(i);
end;
S2.SaveToFile('out.sql');}
// stop program loop
Terminate;
end;
constructor TMyApplication.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor TMyApplication.Destroy;
begin
inherited Destroy;
end;
procedure TMyApplication.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ',ExeName,' [-h|help] [-s000] <dump-fn>');
writeln;
writeln(' [-h|help] ÐÑа ÑпÑавка');
writeln(' [-s000] ÐолиÑеÑÑво запиÑей в ÑÑÑоке');
end;
var
Application: TMyApplication;
begin
Application:=TMyApplication.Create(nil);
Application.Title:='ÐбÑабоÑка MySQL дампа';
writeln(Application.Title);
Application.Run;
Application.Free;
end.
\0Может быть это в дампе уже обрезание до 9999 символов?
А не, эта же программа P2 на файле со строкой 2 мегабайта, выдает кучу 9999.
Добавлено спустя 11 минут 4 секунды:
Всё, разобрался, в файле дампа, строки и вправду были по 9999, просто текстовый редактор мне показывал, что строка 1. Спасибо, тёзка!
Добавлено спустя 11 минут 4 секунды:
Всё, разобрался, в файле дампа, строки и вправду были по 9999, просто текстовый редактор мне показывал, что строка 1. Спасибо, тёзка!
А так?
Правда за счёт дополнительной процедуры выделение память под строковый буфер скорость будет невысокая...
Добавлено спустя 1 минуту 50 секунд:
Отлично.
Код: Выделить всё
{$H+}
Program p2;
Uses SysUtils;
Var
fh: Integer;
fl: Integer;
s: PChar;
Begin
fh:=FileOpen('1.txt', fmOpenRead);
fl:=FileSeek(fh, 0, 2);
s:=PChar(AllocMem(fl + 1));
FileSeek(fh, 0, 0);
FileRead(fh, s^, fl);
WriteLn('Длина файла: ', fl);
WriteLn('Длина строки: ', StrLen(s));
FileClose(fh);
End.Правда за счёт дополнительной процедуры выделение память под строковый буфер скорость будет невысокая...
Добавлено спустя 1 минуту 50 секунд:
Vadimus писал(а):просто текстовый редактор мне показывал, что строка 1. Спасибо, тёзка!
Отлично.
