operacje na plikach ascii memo lub tString

0

jakdo programu wczytc plik ascii najlepiej do memo lub richedit (plik ma ponad 4MB) i wykonywac operacje na nim (wklejac i wycinac fragmenty)

0

TMemo przechowuje maksymalnie 64Kb danych. TRichEdit powinno wczytać bez problemu (tylko z kilkusekundowym opóźnieniem).

0

TRichEdit.Lines.LoadFromFile
TRichEdit.SelStart; TRichEdit.SelLength; TRichEdit.SelText

+F1

0

var
f:textfile;
begin
assignfile(f,'sciezka/nazwa_pliku');
readln(f,zmienna); //czyta linijkę z pliku
writeln(f,zmienna); // zapisuje linijkę do pliku
closefile(f);
end;

0

TMemo przechowuje maksymalnie 64Kb danych. TRichEdit powinno wczytać bez problemu (tylko z kilkusekundowym opóźnieniem).

rich edit wczytuje mi tylko 1 linijke krzaczków nic wiecej.
a co do wklejania to chodzi mi nie o wklejanie na koncu czy na poczatku tylko zastepowianie 1 fragmentu wsrodku pliku drogim o tej samej dlugosci.
no i chodzi niekoniecznie musi to byc plik txt równie dobrze musi to dzialac z kazdym innym typem plików. np. exe

0

rich edit wczytuje mi tylko 1 linijke krzaczków nic wiecej.

Na pewno próbujesz wczytać plik 'binarny'.

a co do wklejania to chodzi mi nie o wklejanie na koncu czy na poczatku tylko zastepowianie 1 fragmentu wsrodku pliku drogim o tej samej dlugosci.

Jak już wspomniałem: SelStart + SelLength + SelText.

no i chodzi niekoniecznie musi to byc plik txt równie dobrze musi to dzialac z kazdym innym typem plików. np. exe

Jeśli to nie będzie plik tekstowy, to zrób zrzut 16-stkowy.

0

a jak ten zrzut 16 zrobic ?? znaczy jak odczytywac te fragmenty pliku do buffora i potem to w calosc jedna polonczyc??

0

a jak ten zrzut 16 zrobic ?? znaczy jak odczytywac te fragmenty pliku do buffora i potem to w calosc jedna polonczyc??

Otwierasz plik (TFileStream.Create...), wyszukujesz w strumieniu potrzebny fragment, ustawiasz na nim pozycję początkową (TFileStream.Position (or Seek)), odczytujesz (w pętli) żądaną liczbę bajtów, zamieniasz bajty na HEXy (IntToHex(Bajt, 2)). Hexy wstawiasz do TRichEdit-a i masz zrzut 16-stkowy fragmentu pliku.

0

a moze jakis kodzik ??

0

w OnClick przycisku wstaw to:

procedure TForm1.Button1Click(Sender: TObject);
var
FOut, FIn: file;
Mem: Pointer;
begin
AssignFile(FOut,Edit1.Text);
AssignFile(FIn,Edit2.Text);
Reset(FOut,FileSize(FIn));
Reset(FIn,FileSize(FIn));
Mem:=AllocMem(FileSize(FIn));
BlockRead(FIn,Mem^,1);
Seek(FOut,StrToInt(Edit3.Text));
BlockWrite(FOut,Mem^,1);
end;

teraz w Edit1 wpisujesz nazwę tego modyfikowanego pliku, w Edit2 nazwę tego który ma być wstawiony do pierwszego, a w Edit3 offset pod którym ma być wstawiony ten drugi plik

dostalem takie cos ale wywala mi błąd I/O 103 wasnie o takie cos mi chodzi.tylko co zrobic zeby to dzialalo ( D5 ent)

0

Wygląda na to, że piszesz jakiegoś patche-a. Czyż nie?

Poniżej masz procedurę wstawiającą jeden plik do drugiego w określonej pozycji:

File1 - nazwa pliku, do którego będzie wstawiony plik FileToInsert;
FileToInsert - nazwa pliku wstawianego;
Position - offset w pliku File1, gdzie ma się rozpocząć wstawianie pliku FileToInsert;
Uwaga: Bajty w pliku File1 od pozycji Position do Position+fsInserted.Size są nadpisywane zawartością pliku FileToInsert, czyli inaczej mówiąc - klasyczny PATCH.

procedure InsertFileToFile(const File1, FileToInsert: string; Position: integer);
var
  fs, fsInserted: TFileStream;
  buffer: array[0..11] of byte;
  x: integer;
begin
  fs := TFileStream.Create(File1, fmOpenReadWrite);
  fsInserted := TFileStream.Create(FileToInsert, fmOpenRead);
  try
    fs.Position := Position;
    repeat
      x := fsInserted.Read(buffer, SizeOf(buffer));
      fs.Write(buffer, x);
    until x < SizeOf(buffer);
  finally
    fs.Free;
    fsInserted.Free;
  end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1