Tablica dwuwymiarowa do pliku np. xml

Odpowiedz Nowy wątek
2011-07-28 18:33
NTw
0

Mam taką tablicę:

Tablica : array[0..199, 0..4] of String;

Jak ją teraz w najprostszy sposób zapisać do pliku .xml by potem móc tą tablicą załadować z powrotem? Lub jakiś inny sposób bym mógł załadować moją tablicę po ponownym uruchomieniu programu

Pozostało 580 znaków

2011-07-28 19:01
1

Możesz zapisać to do pliku INI, podzielonego na 5 sekcji o 200 kluczach.

procedure Zapisz;
var
  Tablica : array [0..4, 0..199] of String;
  INI: TINIFile;
  I, J : Integer;
begin
  INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'plik.ini');
  for I := 0 to 4 do
    for J := 0 to 199 do
      try
        INI.WriteString('Sekcja' + IntToStr(I), Klucz + IntToStr(J), Tablica[I, J]);
      finally
        INI.Free;
      end;
end;

Odczytujesz tak samo, tylko że linijkę INI.WriteString... zamień na

Tablica[I, J] := INI.ReadString('Sekcja' + IntToStr(I), Klucz + IntToStr(J), 'wartosc');

char mander; bool basaur;
edytowany 2x, ostatnio: TomRiddle, 2011-07-28 19:08
Chyba na 5 sekcji po 200 kluczy. Tablica jest numerowana od zera! - Patryk27 2011-07-28 19:07
Tak, rację Patryku Masz. - TomRiddle 2011-07-28 19:09

Pozostało 580 znaków

2011-07-28 19:06
O_o
0

Się męczysz.

string[] data = System.IO.File.ReadAllLines("pliczek");
// pobranie elementu [x,y]
data[x*4+y];

A fuj to nie C# tylko Delphiok :D

var data:TStringList;
...
data:=TStringList.Create();
data.LoadFromFile('pliczek');
// pobranie elementu [x,y]
data[x*5+y];

O̾..͠o
edytowany 7x, ostatnio: O_o, 2011-07-28 19:34
Pokaż pozostałe 11 komentarzy
W cepach da się ignorować odgórnie narzucone wymiary i można bez problemu potraktować n wymiarową tablicę jako tablicę m wymiarową ( przy uwzględnieniu że jest "kwadratowa", z tablicami "poszarpanymi" już tak fajnie nie jest ) - O_o 2011-07-28 20:05
Jak już tu zbłądziłem - tablica dwuwymiarowa to właśnie często wewnętrznie jest (np. w C#, w innych językach różnie to można implementować) tablica jednowymiarowa z zapisaną szerokością. Przez to jest przy GC mniej efektywna bo jest to ciągły blok pamięci a to nie pomaga w czyszczeniu. (Inaczej jest z jagged array która jest tablicą tablic) - msm 2011-07-31 00:00
Tablice w C# łoo, kiedy ja ich ostatnio używałem ;) W .NET robię z wygody więc sobie pozwalam szaleć z generykami, tablice pojawiają się mi jak mi je jakaś funkcja zwróci, a jak chce przyjac to zawsze mogę .ToArray() zrobić. - O_o 2011-07-31 00:23
Ja niestety niekiedy muszę bo czasami się grafiką real time zajmuję i trzeba zrobić jakąś optymalizacje (ale i tak zazwyczaj pakuję tablicę w jakąś klasę zewnętrzną żeby to jakoś wyglądało). Ale racja, z LINQ używanie IEnumerable<T> to sama przyjemność. - msm 2011-07-31 00:29
Tablice są dla jaskiniowców ;) - O_o 2011-07-31 00:33

Pozostało 580 znaków

2011-07-28 20:09
NTw
0

Pierwszy kod mi nie działa poprawnie, dziwnie to zapisuje i nie potrafi odczytać:

Tak to zapisuje, to poprawne?:

 [Sekcja0]
Klucz0=tablica 0 element 0
Klucz1=tablica 0 element 1
Klucz2=tablica 0 element 2
Klucz3=tablica 0 element 3
Klucz4=tablica 0 element 4
Klucz5=tablica 1 element 0
Klucz6=tablica 1 element 1
Klucz7=tablica 1 element 2
Klucz8=tablica 1 element 3
Klucz9=tablica 1 element 4
Klucz10=
Klucz11=
Klucz12=
Klucz13=

Co do drugiego kodu to to samo odczytywanie stringlist z pliku, gdzie tu zapis tablicy ?

Pozostało 580 znaków

2011-07-28 20:15
0

Powinno zapisać tak

[Sekcja1]
Klucz1=ElementTablicy1na1
Klucz1=ElementTablicy1na2
Klucz1=ElementTablicy1na3
[...]
[Sekcja2]
Klucz1=ElementTablicy2na1
Klucz1=ElementTablicy2na2
Klucz1=ElementTablicy2na3
[...]
[Sekcja3]
Klucz1=ElementTablicy3na1
Klucz1=ElementTablicy3na2
Klucz1=ElementTablicy3na3
[...]

edit: Według mojego kodu.


char mander; bool basaur;
edytowany 2x, ostatnio: TomRiddle, 2011-07-28 20:17

Pozostało 580 znaków

2011-07-28 20:22
NTw
0
procedure TForm1.Zapisz;
var
  INI: TINIFile;
  I, J : Integer;
begin
  INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'plik.ini');
  for I := 0 to 4 do
    for J := 0 to 199 do
      try
        INI.WriteString('Sekcja' + IntToStr(I), 'Klucz' + IntToStr(J), Posty[I, J]);
      finally
        //INI.Free;
        posty.
      end;
end;
 
procedure TForm1.Otworz;
var
  INI: TINIFile;
  I, J : Integer;
begin
  INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'plik.ini');
  for I := 0 to 4 do
    for J := 0 to 199 do
      try
        Posty[I, J] := INI.ReadString('Sekcja' + IntToStr(I), 'Klucz' + IntToStr(J), 'wartosc');
      finally
        //INI.Free;
      end;
end;

INI.Free musiałem tymczasowo dać w komentarz bo powoduje błąd acces violation nie wiem czemu ;/ Ale i tak zapisuje źle

Wiem czemu. INI.Free, daj poza pętle... Mój błąd. - TomRiddle 2011-07-28 20:27

Pozostało 580 znaków

2011-07-28 20:41
O_o
0

A więc twierdzisz że nie potrafisz zapisać StringList do pliku?
<przerwa na śmiech>

data.SaveToFile("pliczek");

O̾..͠o

Pozostało 580 znaków

2011-07-28 20:45
NTw
0

To wiem ale to stringlist, jak to powiązać z tablicą?

StringList jest listą stringów, tablica jest zbędna, jak przeliczyć współrzędne tablicy dwuwymiarowej na jednowymiarową pisałem wyżej. - O_o 2011-07-28 21:38

Pozostało 580 znaków

2011-07-28 21:21
1

Się męczycie.

procedure TForm1.Zapisz;
var
  INI: TINIFile;
  I, J : Integer;
begin
  INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'plik.ini');
  try
  for I := 0 to 4 do
    for J := 0 to 199 do INI.WriteString('Sekcja' + IntToStr(I), 'Klucz' + IntToStr(J), Posty[I, J]);
  finally
  INI.Free;
  end;
end;
 
procedure TForm1.Otworz;
var
  INI: TINIFile;
  I, J : Integer;
begin
  INI := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'plik.ini');
  try
  for I := 0 to 4 do
    for J := 0 to 199 do Posty[I, J] := INI.ReadString('Sekcja' + IntToStr(I), 'Klucz' + IntToStr(J), 'wartosc');
  finally
    INI.Free;
  end;
end;

Nie pisz do mnie PM o czymś co nie dotyczy bezpośrednio mnie. | Nie rozmawiaj ze mną jeśli brak Ci kultury (wystarczy że mi brakuje) | Nie jestem zły, jestem po prostu zły.

Pozostało 580 znaków

2011-07-28 22:03
NTw
0

Działa dziękuuuuuuuje :D !

zeby nie było - ja tylko poprawiłem kod TomRiddle, o których to poprawkach Ci wspomniał ale nie potrafiłeś ich zaimplementować >.> . - payl 2011-07-29 00:13

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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