Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2015, 14:47   #21
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Хотя видно другого способа нету. Вообще хотелось бы читать через TFileStream
Как думаете, что используется внутри LoadFromFile?

Вот его исходник из ХЕ5:
Код:
procedure TStrings.LoadFromFile(const FileName: string; Encoding: TEncoding);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    LoadFromStream(Stream, Encoding);
  finally
    Stream.Free;
  end;
end;

procedure TStrings.LoadFromStream(Stream: TStream; Encoding: TEncoding);
var
  Size: Integer;
  Buffer: TBytes;
begin
  BeginUpdate;
  try
    Size := Stream.Size - Stream.Position;
    SetLength(Buffer, Size);
    Stream.Read(Buffer, 0, Size);
    Size := TEncoding.GetBufferEncoding(Buffer, Encoding, FDefaultEncoding);
    SetEncoding(Encoding); // Keep Encoding in case the stream is saved
    SetTextStr(Encoding.GetString(Buffer, Size, Length(Buffer) - Size));
  finally
    EndUpdate;
  end;
end;
В общем я о том, что если надо, то TEncoding и с TFileStream можно использовать.
Как-то так например (вероятно можно без дополнительного буфера Bytes, но я не в курсе как, не писал на Дельфи давно)
Код:
var
  Size: Int64;
  Stream: TFileStream;
  Bytes: TBytes;
  Str: WideString;
begin
  Stream := TFileStream.Create('SRead.xml.txt', fmOpenRead);
  try
    Size := Stream.Size;
    SetLength(Bytes, Size);
    Stream.Read(Bytes[0], Size);
    Str := TEncoding.GetEncoding(1251).GetString(Bytes);
  finally
    Stream.Free;
  end;
Если бы текст был в UTF8, то можно так:
Код:
var
  Size: Int64;
  Stream: TFileStream;
  Str: UTF8String;
begin
  Stream := TFileStream.Create('SRead.xml.txt', fmOpenRead);
  try
    Size := Stream.Size;
    SetLength(Str, Size);
    Stream.Read(Str[1], Size);
  finally
    Stream.Free;
  end;
(WideString это UTF16, String=WideString начиная с 2009 и AnsiString до нее)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 11.03.2015 в 14:49.
Alex11223 вне форума Ответить с цитированием
Старый 11.03.2015, 14:48   #22
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
не было
Да не этот файл что я скинул.
Вот этот:
Вложения
Тип файла: txt region_colors.asm.txt (5.9 Кб, 147 просмотров)
Alexandr17 вне форума Ответить с цитированием
Старый 11.03.2015, 14:51   #23
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Как думаете, что используется внутри LoadFromFile?

Вот его исходник из ХЕ5:
Код:
procedure TStrings.LoadFromFile(const FileName: string; Encoding: TEncoding);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    LoadFromStream(Stream, Encoding);
  finally
    Stream.Free;
  end;
end;

procedure TStrings.LoadFromStream(Stream: TStream; Encoding: TEncoding);
var
  Size: Integer;
  Buffer: TBytes;
begin
  BeginUpdate;
  try
    Size := Stream.Size - Stream.Position;
    SetLength(Buffer, Size);
    Stream.Read(Buffer, 0, Size);
    Size := TEncoding.GetBufferEncoding(Buffer, Encoding, FDefaultEncoding);
    SetEncoding(Encoding); // Keep Encoding in case the stream is saved
    SetTextStr(Encoding.GetString(Buffer, Size, Length(Buffer) - Size));
  finally
    EndUpdate;
  end;
end;
В общем я о том, что если надо, то TEncoding и с TFileStream можно использовать.
Как-то так например (вероятно можно без дополнительного буфера Bytes, но я не в курсе как, не писал на Дельфи давно)
Код:
var
  Size: Int64;
  Stream: TFileStream;
  Bytes: TBytes;
  Str: WideString;
begin
  Stream := TFileStream.Create('SRead.xml.txt', fmOpenRead);
  try
    Size := Stream.Size;
    SetLength(Bytes, Size);
    Stream.Read(Bytes[0], Size);
    Str := TEncoding.GetEncoding(1251).GetString(Bytes);
  finally
    Stream.Free;
  end;
Если бы текст был в UTF8, то можно так:
Код:
var
  Size: Int64;
  Stream: TFileStream;
  Str: UTF8String;
begin
  Stream := TFileStream.Create('SRead.xml.txt', fmOpenRead);
  try
    Size := Stream.Size;
    SetLength(Str, Size);
    Stream.Read(Str[1], Size);
  finally
    Stream.Free;
  end;
(WideString это UTF16, String=WideString начиная с 2009 и AnsiString до нее)
А если кодировка неизвестна. Она может быть любой. В принципе можно и через TStringList. Для asm вообще самый оптимальный вариант это читать построчно. Да к томуже так как он имеет кое какие баги. То это единственный вариант.
Alexandr17 вне форума Ответить с цитированием
Старый 11.03.2015, 14:56   #24
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Да не этот файл что я скинул.
Да и в этом, скорее нет, чем есть, лень до конца пялиться на него. А вот табуляции навалом (09h).
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.03.2015, 15:00   #25
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Да и в этом, скорее нет, чем есть, лень до крнца пялиться на него. А вот табуляции навалом (09h).
Что табуляции навалом это ясно. Темболее что файл сегавской игры. А вот в какойто строчке 100 % #13#10#13 есть. Так как когда я копировал используя COPY он мне 1 строчку при проверки дебагом выдал
#130
ну вообщето он выдал примерно это '0'#$A
кОГДА КАК ПО ИДЕИ ОРИЕНТИРУЯСЬ НА #13#10 ОН ДОЛЖЕН МНЕ БЫЛ ПРОСТО 0 СКОПИРОВАТЬ.
Alexandr17 вне форума Ответить с цитированием
Старый 11.03.2015, 15:19   #26
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

#13#10#13#10 есть, и не мало, а #13#10#13 без #10 нет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.03.2015, 15:26   #27
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Для файла асемблера с расширением ASM
Потомучто когда я использовал побайтное чтение через read на delphi 7 у меня именно на этом файле не коректно работал copy и delete.
Дело в том что именно в этом файле вместо #13#10 на некоторых строках было #13#10#13
Возможно баг при чтении.
разруха не в клозетах, а в головах! (© Булгаков)
дай файл.
Цитата:
Вот и подумываю по чтению через tfilestream.
Помогите делать чтение через tfilestream.
и не подумаю! это будет чистое вредительство!
Цитата:
Всеже он больше подходит для скриптинга и парсинга.
плюнь в лицо тому, кто тебе это сказал!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 11.03.2015, 15:33   #28
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Значит я не знаю в чем там баг был допущен.
а КАК ПОСТРОЧНО ЧЕРЕЗ TSTRINGLIST ЗАГРУЖАТЬ. Только через цикл for
Для милиона строк зависнит все к чертям. Либо я читаю построчна и по мере чтения делаю сразу обработку. Либо я обрабатываю после чтения всего файла. Тут большая разница.
Необходимо этот код под Delphi 2009 передлать
Код:
procedure TfrmRCE.LoadAsmRC(FileName: String; idDom:CHar);
var FileAsm:TextFile;
  s:String;
  ws, wstr:WideString;
  edScriptb, edScriptb1, edScriptb2:Boolean;
  iacol, iarow:Integer;
  i:Array[0..5] of Integer;
  i1:integer;
begin
  try
    AssignFile(FileAsm, FileName);
    ReSet(FileAsm);
    ws:='';
    while not Eof(FileAsm) do begin
      readln(FileAsm, s);
      ws:=ws+s;
      ws:=ws+#13#10;
      wstr:=s;
      if AnsiLowerCase(wStr) = ';'+AnsiLowerCase(SEndMatrix)+AnsiLowerCase(SPtoU)+':'+AnsiLowerCase(iddom) then
        edScriptb:=false;
      if AnsiLowerCase(wStr) = ';'+AnsiLowerCase(SEndMatrix)+AnsiLowerCase(SRCD)+':'+AnsiLowerCase(iddom) then
        edScriptb1:=false;
      if AnsiLowerCase(wStr) = ';'+AnsiLowerCase(SEndMatrix)+AnsiLowerCase(SRMD)+':'+AnsiLowerCase(iddom) then
        edScriptb2:=false;
      if edScriptb then begin
        if pos(';', wstr) > 0 then
          delete(wstr,pos(';', wstr),LENGTH(wstr));
        wstr:=ToReplaceText(wstr, [#9, #32],['', '']);
        While pos(',', wstr) > 0 do begin
          MatrixColorRegionIndexArray[iacol, iarow]:=StrToInt(Copy(wstr,pos(',', wstr)-1,1));
          Delete(wstr, pos(',', wstr)-1, 2);
          iacol:=iacol+1;
        end;
        if pos('dc.b', AnsiLowerCase(wstr)) > 0 then begin
          MatrixColorRegionIndexArray[iacol, iarow]:=StrToInt(Copy(wstr,pos('dc.b', AnsiLowerCase(wstr))+4,1));
          delete(wstr,pos('dc.b', AnsiLowerCase(wstr)),5);
        end;
        iacol:=0;
        iarow:=iarow+1;
      end;
      if edScriptb1 then begin
        if pos(';', wstr) > 0 then
          delete(wstr,pos(';', AnsiLowerCase(wstr)),LENGTH(wstr));
        wstr:=ToReplaceText(wstr, [#9, #32],['', '']);
        While pos(',', wstr) > 0 do begin
          MatrixColorRegionArray[iacol, iarow]:=StrToInt(Copy(wstr,pos(',', wstr)-1,1));
          Delete(wstr, pos(',', wstr)-1, 2);
          iacol:=iacol+1;
        end;
        if pos('dc.w', AnsiLowerCase(wstr)) > 0 then begin
          MatrixColorRegionArray[iacol, iarow]:=StrToInt(Copy(wstr,pos('dc.w', AnsiLowerCase(wstr))+4,1));
          delete(wstr,pos('dc.w', AnsiLowerCase(wstr)),5);
        end;
        iacol:=0;
        iarow:=iarow+1;
      end;
      if edScriptb2 then begin
        if pos(';', wstr) > 0 then
          delete(wstr,pos(';', AnsiLowerCase(wstr)),LENGTH(wstr));
        wstr:=ToReplaceText(wstr, [#9, #32],['', '']);
        MatrixIDRegionSelectArray[iarow]:=StrToInt(Copy(wstr, pos(',', wstr)+1, 1));
        iarow:=iarow+1;
      end;
      If Pos(';'+AnsiLowerCase(SStartMatrix)+AnsiLowerCase(SPtoU)+':'+AnsiLowerCase(iddom), AnsiLowerCase(wStr)) > 0 then begin
        edScriptb:=True;
        iacol:=0;iarow:=0;
      end;
      if Pos(';'+AnsiLowerCase(SStartMatrix)+AnsiLowerCase(SRCD)+':'+AnsiLowerCase(iddom), AnsiLowerCase(wStr)) > 0 then begin
        edScriptb1:=True;
        iacol:=0;iarow:=0;
      end;
      if Pos(';'+AnsiLowerCase(SStartMatrix)+AnsiLowerCase(SRMD)+':'+AnsiLowerCase(iddom), AnsiLowerCase(wStr)) > 0 then begin
        edScriptb2:=True;
        iacol:=0;iarow:=0;
      end;
    end;
    for i1 := 0 to 5 do
      i[i1]:=0;
    i[0]:=Pos(';'+AnsiLowerCase(SStartMatrix)+AnsiLowerCase(SPtoU)+':'+AnsiLowerCase(iddom), AnsiLowerCase(ws))+Length(';'+AnsiLowerCase(SStartMatrix)+AnsiLowerCase(SPtoU)+':'+AnsiLowerCase(iddom)+#13#10);
    i[1]:=Pos(';'+AnsiLowerCase(SEndMatrix)+AnsiLowerCase(SPtoU)+':'+AnsiLowerCase(iddom), AnsiLowerCase(ws));

    i[2]:=Pos(';'+AnsiLowerCase(SStartMatrix)+AnsiLowerCase(SRCD)+':'+AnsiLowerCase(iddom), AnsiLowerCase(ws))+Length(';'+AnsiLowerCase(SStartMatrix)+AnsiLowerCase(SRCD)+':'+AnsiLowerCase(iddom)+#13#10);
    i[3]:=Pos(';'+AnsiLowerCase(SEndMatrix)+AnsiLowerCase(SRCD)+':'+AnsiLowerCase(iddom), AnsiLowerCase(ws));

    i[4]:=Pos(';'+AnsiLowerCase(SStartMatrix)+AnsiLowerCase(SRMD)+':'+AnsiLowerCase(iddom), AnsiLowerCase(ws))+Length(';'+AnsiLowerCase(SStartMatrix)+AnsiLowerCase(SRMD)+':'+AnsiLowerCase(iddom)+#13#10);
    i[5]:=Pos(';'+AnsiLowerCase(SEndMatrix)+AnsiLowerCase(SRMD)+':'+AnsiLowerCase(iddom), AnsiLowerCase(ws));

    OtherText[0]:=Copy(ws, 1, i[0]-1);
    OtherText[1]:=Copy(ws, i[1], i[2]-i[1]);
    OtherText[2]:=Copy(ws, i[3], i[4]-i[3]);
    OtherText[3]:=Copy(ws, i[5], Length(ws));
  finally
    CloseFile(FileAsm);
  end;
end;
Alexandr17 вне форума Ответить с цитированием
Старый 11.03.2015, 15:34   #29
Alexandr17
Форумчанин
 
Регистрация: 10.12.2013
Сообщений: 227
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
разруха не в клозетах, а в головах! (© Булгаков)
дай файл.

и не подумаю! это будет чистое вредительство!

плюнь в лицо тому, кто тебе это сказал!
http://www.programmersforum.ru/attac...5&d=1426074518
Да в принципе уе согласился что через TStringList читать будет лучше. К томуже не бинарные файлы. Но вот код выше мне под delphi 2009нужно переделать
Alexandr17 вне форума Ответить с цитированием
Старый 11.03.2015, 15:36   #30
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Да не этот файл что я скинул.
Вот этот:
Вложения
Тип файла: txt region_colors.asm.txt
прекрасно открывается и обрабатывается. чот ты гонишь, дrужок!
Цитата:
#13#10#13#10 есть, и не мало, а #13#10#13 без #10 нет
подтвеждаю, проверил, чтобы убедиться.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 2009 проблемы!!! sanekch1 Помощь студентам 3 07.08.2010 15:53
проблемы с Char и String в 2009 Delphi Kurai Помощь студентам 4 12.04.2010 14:56
Проблемы с чтением данных в Delphi cyberandom Помощь студентам 11 05.02.2010 19:52
Проблемы с выполнением ХП в Delphi 2009 MargoNik БД в Delphi 10 01.06.2009 08:53
Проблемы с framework-ом ну и с Delphi 2009 Altera Свободное общение 1 18.05.2009 22:07