Длина строки = 9999

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Длина строки = 9999

Сообщение Vadimus » 28.08.2014 12:54:44

Пишу консольное приложение на Lazarus 1.0.8, FPC 2.6.2, ОS Ubuntu x64.

Считываю длинные строки из файла. Длина очень длинных строк всегда равна 9999 символов. И Length и UTF8Length. Пробовал из TSTringList.LoadFromStream - то же самое.

Копаю и не могу понять в чём проблема. Кстати, например, Trim и Delete прекрасно работают со строкой.
Vadimus
новенький
 
Сообщения: 19
Зарегистрирован: 11.02.2011 16:56:16

Re: Длина строки = 9999

Сообщение Vadim » 28.08.2014 13:27:36

Тест:
Код: Выделить всё
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
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Длина строки = 9999

Сообщение Vadimus » 28.08.2014 13:44:05

Vadim, блин, и вправду, скомпилировал FPC, показывает 12001. Что-то с настройками в Lazarus... Сам в шоке, копаюсь.

Добавлено спустя 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
Vadimus
новенький
 
Сообщения: 19
Зарегистрирован: 11.02.2011 16:56:16

Re: Длина строки = 9999

Сообщение Vadim » 28.08.2014 13:55:25

Может быть это в дампе уже обрезание до 9999 символов?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Длина строки = 9999

Сообщение Vadimus » 28.08.2014 13:56:54

А не, эта же программа P2 на файле со строкой 2 мегабайта, выдает кучу 9999.

Добавлено спустя 11 минут 4 секунды:
Всё, разобрался, в файле дампа, строки и вправду были по 9999, просто текстовый редактор мне показывал, что строка 1. Спасибо, тёзка! :)
Vadimus
новенький
 
Сообщения: 19
Зарегистрирован: 11.02.2011 16:56:16

Re: Длина строки = 9999

Сообщение Vadim » 28.08.2014 14:25:34

А так?
Код: Выделить всё
{$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. Спасибо, тёзка!

Отлично. ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 225

Рейтинг@Mail.ru
cron