Operacja na pliku

0

Mam procedurę zapisującą

procedure TForm1.zapisz;
var
i : integer;
begin
setlength(buff_string,1);
AssignFile(Plik,'opek.dto');
Rewrite(Plik,1);
buff_string[0] := inttostr(memo1.lines.count - 1);
BlockWrite(Plik,buff_string[0],1);
for i:=0 to memo1.lines.count - 1 do
begin
buff_string[0] := memo1.lines[i];
BlockWrite(Plik,buff_string[0],i + 2);
end;
CloseFile(Plik);
end;

i procedurę otwierającą

procedure TForm1.otworz;
var
i : integer;
lines_count : integer;
begin
memo1.lines.clear;
setlength(buff_string,1);
AssignFile(Plik,'opek.dto');
Reset(Plik,1);
Seek(plik,1);
Blockread(Plik,buff_string[0],1);
buff := strtoint(buff_string[0]);
for i:=2 to buff do
begin
Blockread(Plik,buff_string[0],i);
memo1.lines.add(buff_string[0]);
end;
CloseFile(Plik);
end;

teraz przy otwieraniu pliku wywala mi jakieś raise exception Access violation itp. itd.

Fajnie jakby ktoś poprawił ten kod - idea ma polegać na zapisywaniu linii z memo1 do pliku ale pierwsza linijka pliku zawsze będzie zawierała informację o ilości lini w memo - aby w memo mozna bylo odczytac for i:= to liczba z tego początku

0

ZIOMBER napisał:
Mam procedurę zapisującą
&gt
&gtprocedure TForm1.zapisz;
&gtvar
&gti : integer;
&gtbegin
&gtsetlength(buff_string,1);

ustawiasz dlugosc bufora na 1 bajt (zakladam ze bufor to string)

&gtAssignFile(Plik,'opek.dto');
&gtRewrite(Plik,1);
&gtbuff_string[0] := inttostr(memo1.lines.count - 1);

stringi sa numerowane od 1, nie istnieje indeks 0
poza tym liczba linii (jesli&gt10) nie zmiesci sie do stringa o dlugosci 1

&gtBlockWrite(Plik,buff_string[0],1);
&gtfor i:=0 to memo1.lines.count - 1 do
&gtbegin
&gtbuff_string[0] := memo1.lines[i];

indeks 0 vide powyzej, linia cala tez sie nie zmiesci do stringu o dlug 1

&gtBlockWrite(Plik,buff_string[0],i + 2);

czy ty aby rozumiesz trzeci parametr BlockWrite? To nie jest pozycja w pliku, tylko liczba rekordow (u ciebie 1-bajtowych, bo Rewrite(Plik,1)) do zapisu.

&gtend;
&gtCloseFile(Plik);
&gtend;
&gt
&gt
&gti procedurę otwierającą
&gt
&gtprocedure TForm1.otworz;
&gtvar
&gti : integer;
&gtlines_count : integer;
&gtbegin
&gtmemo1.lines.clear;
&gtsetlength(buff_string,1);
&gtAssignFile(Plik,'opek.dto');
&gtReset(Plik,1);
&gtSeek(plik,1);

pliki numeruja sie od zera

&gtBlockread(Plik,buff_string[0],1);
&gtbuff := strtoint(buff_string[0]);
a stringi od 1 (j.w.)

&gtfor i:=2 to buff do
&gtbegin
&gtBlockread(Plik,buff_string[0],i);
j.w.

&gtmemo1.lines.add(buff_string[0]);
&gtend;
&gtCloseFile(Plik);
&gtend;
&gt
&gt

To by bylo na tyle (chyba ze nie zrozumialem o co chodzi ;) )--Pawel {Delphi6 }

Po pierwsze: naciśnij F1

0

public
plik, output : File;
buff : byte;
buff_string : array of string;
data : byte;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);*zapisywanie
var
i : integer;
begin
setlength(buff_string,1);
AssignFile(Plik,'opek.dto');
Reset(Plik,1);
seek(Plik,1);
buff := memo1.lines.count - 1;
BlockWrite(Plik,buff,0);
for i:=2 to memo1.lines.count - 1 do
begin
buff_string[0] := memo1.lines[i];
BlockWrite(Plik,buff_string[0],i);
end;
CloseFile(Plik);
end;

procedure TForm1.Button2Click(Sender: TObject);*otwieranie
var
i : integer;
begin
memo1.lines.clear;
setlength(buff_string,1);
AssignFile(Plik,'opek.dto');
Reset(Plik,1);
Seek(plik,0);
Blockread(Plik,buff,0);
showmessage(inttostr(buff));
for i:=2 to buff do
begin
Blockread(Plik,buff_string[0],i);
showmessage(buff_string[0]);
memo1.lines.add(buff_string[0]);
end;
CloseFile(Plik);
end;

A napisz mi tu kod juz zmieniony proszę ciebie!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

0

Sorry, ZIOMBER, chwilowo nie mam czasu nad tym myslec. Problem polega na tym, ze linia w Memo moze byc roznej dlugosci, wiec ciezko ja zapisac do pliku innego niz tekstowy.

Pytanie 1. Po co Ci liczba linii na poczatku pliku?

Pytanie 2. Dlaczego nie uzyc po prostu Memo1.SaveToFile/LoadFromFile?

--Pawel {Delphi6 }

Po pierwsze: naciśnij F1

0

Chcę mieć swoj własny typ pliku :)))) ale dobra rada dzięki string mam max znaków 255 a może i więcej - nie wziąłem tego pod uwgę dzięki, alejak będziesz miał czas to spróbuj zroibć :)

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