Ĺadny brzuch
Witam.
Mam problem z zapisanie do pliku tablicy z danymi typu String.
Do zapisu tablicy zastosowałem kod:
var NumRead, NumWritten: integer; plik: file Begin assignfile(plik, 'C:\plik.tab'); rewrite(plik); BlockWrite(plik, tablica, NumRead, NumWritten); closefile(plik); end;
a do odczytu:
assignfile(plik, 'C:\plik.tab'); if FileExists('C:\plik.tab') then Reset(plik, 1) else rewrite(plik); BlockRead(plik, tablica, SizeOf(tablica), NumRead); closefile(plik);
Niestety działa to dobrze tylko wtedy kiedy po uruchomieniu programu najpierw zapisze plik a potem a potem go odczytam. Po ponownym uruchomieniu programu, kiedy próbuje odczytać zapisany plik to wyskakują bzdury.
Powiedzcie jaki robie błąd. Może znacie jakieś inne sposoby na zapisanie zmiennej tablicowej typu string lub całego komponentu StringGrid.
Pozdrawiam
//codebox !
Użytkownik migajek edytował ten post 07 listopad 2005, 20:38
Moze zamiast zapisywac tablice w calosci, zrob petle for i:=0 to count(tablica) i w kazdym przebiegu petli wpisuj na koniec pliku tablica[i];. Z odczytem podobnie - odczytujesz caly plik, i potem w petli sprawdzasz znaki - jesli natrafi na #10 a potem #13 to niech doda do tablicy poprzednia zmienna tj
zmienna:=''; for i:=0 to lenght(tekst) do //tekst = odczytany z pliku tekst begin zmienna:=zmienna+tekst[i]; if (tekst[i]=#10) and (tekst[i+1]=#13) then begin tablica[i]:=zmienna; zmienna:=''; end else continue; end;
Potrzebuje szybkiego zapisu i odczytu.
Stosowałem wcześniej przekonwertowanie na na tablicę o jednym wierszu a następnie zapisywałem poprzez:
tablica1.rows[1].SaveToFile(' ');
a odczytywałem
tablica1.rows[1].LoadToFile(' ');
jednak odczyt tablicy z 7000 elementów trwał kilka sekund.
Ja bym sobie to na pliku ini zrobił
Zapis
Var i: integer; Ini: TIniFile; tablica: array of string; ini := TIniFile.create('c:\123.txt'); ini.WriteInteger('Tablica', 'Rozmiar', High(Tablica)); for i := 0 to High(Tablica) do ini.writestring('Tablica', IntToStr(i), Tablica[i]); ini.free;
Odczyt
Var i: integer; Ini: TIniFile; tablica: array of string; ini := TIniFile.create('c:\123.txt'); i := ini.ReadInteger('Tablica', 'Rozmiar', 0); SetLength(Tablica, i); for i := 0 to High(Tablica) do Tablica[i] := ini.ReadString('Tablica', IntToStr(i), ''); ini.free;
Ale czy w pliku *.INI moge zapisać tablicę dwuwymiarową??
Ale czy w pliku *.INI moge zapisać tablicę dwuwymiarową??
Niestety jest to nadal za wolny odczyt i zapis. Tabela o wymiarach [6, 2000] zapisuje się do pliku o wadze ok 50 kB. Zapis lub odczyt trwa kilkadziesiąt sekund.
Może ktoś zna szybszy sposób.
Jedna moja rada: najwolniejszy jest tutaj odczyt z pliku (chodzi mi o mały bufor), rozwiązanie: najpierw kopiowanie całego pliku do pamięci, potem odczytanie właściwych danych :)
Niestety zapis też jest powolny.
A odnośnie odczytu to w jaki sposób przepisać plik do pamięci??
Niestety zapis też jest powolny.
A odnośnie odczytu to w jaki sposób przepisać plik do pamięci?? Na razie do zapisu zamiast TIniFile użyj TMemIniFile; wtedy po całym zapisie (writestring ...) dodaj twoj_mem_ini_file.UpdateFile;, powinno pójść szybciej :) Z odczytem jeszcze trzeba pomyśleć...
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Mam problem z zapisanie do pliku tablicy z danymi typu String.
Do zapisu tablicy zastosowałem kod:
var NumRead, NumWritten: integer; plik: file Begin assignfile(plik, 'C:\plik.tab'); rewrite(plik); BlockWrite(plik, tablica, NumRead, NumWritten); closefile(plik); end;
a do odczytu:
assignfile(plik, 'C:\plik.tab'); if FileExists('C:\plik.tab') then Reset(plik, 1) else rewrite(plik); BlockRead(plik, tablica, SizeOf(tablica), NumRead); closefile(plik);
Niestety działa to dobrze tylko wtedy kiedy po uruchomieniu programu najpierw zapisze plik a potem a potem go odczytam. Po ponownym uruchomieniu programu, kiedy próbuje odczytać zapisany plik to wyskakują bzdury.
Powiedzcie jaki robie błąd. Może znacie jakieś inne sposoby na zapisanie zmiennej tablicowej typu string lub całego komponentu StringGrid.
Pozdrawiam
//codebox !
Użytkownik migajek edytował ten post 07 listopad 2005, 20:38
Moze zamiast zapisywac tablice w calosci, zrob petle for i:=0 to count(tablica) i w kazdym przebiegu petli wpisuj na koniec pliku tablica[i];. Z odczytem podobnie - odczytujesz caly plik, i potem w petli sprawdzasz znaki - jesli natrafi na #10 a potem #13 to niech doda do tablicy poprzednia zmienna tj
zmienna:=''; for i:=0 to lenght(tekst) do //tekst = odczytany z pliku tekst begin zmienna:=zmienna+tekst[i]; if (tekst[i]=#10) and (tekst[i+1]=#13) then begin tablica[i]:=zmienna; zmienna:=''; end else continue; end;
Potrzebuje szybkiego zapisu i odczytu.
Stosowałem wcześniej przekonwertowanie na na tablicę o jednym wierszu a następnie zapisywałem poprzez:
tablica1.rows[1].SaveToFile(' ');
a odczytywałem
tablica1.rows[1].LoadToFile(' ');
jednak odczyt tablicy z 7000 elementów trwał kilka sekund.
Ja bym sobie to na pliku ini zrobił
Zapis
Var i: integer; Ini: TIniFile; tablica: array of string; ini := TIniFile.create('c:\123.txt'); ini.WriteInteger('Tablica', 'Rozmiar', High(Tablica)); for i := 0 to High(Tablica) do ini.writestring('Tablica', IntToStr(i), Tablica[i]); ini.free;
Odczyt
Var i: integer; Ini: TIniFile; tablica: array of string; ini := TIniFile.create('c:\123.txt'); i := ini.ReadInteger('Tablica', 'Rozmiar', 0); SetLength(Tablica, i); for i := 0 to High(Tablica) do Tablica[i] := ini.ReadString('Tablica', IntToStr(i), ''); ini.free;
Ale czy w pliku *.INI moge zapisać tablicę dwuwymiarową??
Ale czy w pliku *.INI moge zapisać tablicę dwuwymiarową??

Niestety jest to nadal za wolny odczyt i zapis. Tabela o wymiarach [6, 2000] zapisuje się do pliku o wadze ok 50 kB. Zapis lub odczyt trwa kilkadziesiąt sekund.
Może ktoś zna szybszy sposób.
Jedna moja rada: najwolniejszy jest tutaj odczyt z pliku (chodzi mi o mały bufor), rozwiązanie: najpierw kopiowanie całego pliku do pamięci, potem odczytanie właściwych danych :)
Niestety zapis też jest powolny.
A odnośnie odczytu to w jaki sposób przepisać plik do pamięci??
Niestety zapis też jest powolny.
A odnośnie odczytu to w jaki sposób przepisać plik do pamięci?? Na razie do zapisu zamiast TIniFile użyj TMemIniFile; wtedy po całym zapisie (writestring ...) dodaj twoj_mem_ini_file.UpdateFile;, powinno pójść szybciej :) Z odczytem jeszcze trzeba pomyśleć...