[Rozw.] [C++] Zapis i odczyt dynamicznej tablicy kwadratowej

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Awatar użytkownika
Zielony
Użytkownik
Posty: 535
Rejestracja: 2005-03-17, 18:22
Lokalizacja: Poznań
Kontakt:

[Rozw.] [C++] Zapis i odczyt dynamicznej tablicy kwadratowej

Post autor: Zielony » 2009-11-21, 20:27

Ostatnio nauczyłem się zapisywać i odczytywać tablice jednowymiarowe do/z pliku binarnego w C++ za pomocą write i read z fstream. Teraz pragnąłbym zapisać, no i oczywiście odczytać, tablicę dwuwymiarową stworzoną dynamicznie, przypuśćmy:

Kod: Zaznacz cały

int **tab = new int *[10];
for (int i = 0; i < 10; i++)
   tab[i] = new int[10];

for (int i = 0; i < 10; i++) {
   for (int j = 0; j < 10; j++) {
      tab[i][j] = i * j;
   }
}
Ostatnio zmieniony 2009-11-22, 12:41 przez Zielony, łącznie zmieniany 2 razy.
Żyję - nie każdemu się zdarza - a we krwi mam chlorofil.
[url=http://scxd.info/][img]http://scxd.info/pub/scxdbar/scxd-bar.png[/img][/url]
[b]Registered User #448882[/b]
[img]http://scxd.info/say/img.php[/img]

Awatar użytkownika
dienet
Moderator
Posty: 2106
Rejestracja: 2007-07-24, 18:58
Lokalizacja: Racibórz/Rybnik
Kontakt:

Re: [Rozw.] [C++] Zapis i odczyt dynamicznej tablicy kwadratowej

Post autor: dienet » 2009-11-22, 10:52

Może coś takiego:

Kod: Zaznacz cały

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char **argv)
{
	int **tab = new int *[2];

	tab[0] = new int[2];
	tab[1] = new int[2];

	tab[0][0] = 1024;
	tab[0][1] = 2;

	tab[1][0] = 10;
	tab[1][1] = 10;

	ofstream out("out", ofstream::binary);

	char *ptr = (char *)tab[0];
	out.write(ptr, 2*sizeof(int));

	ptr = (char *)tab[1];
	out.write(ptr, 2*sizeof(int));

	out.close();

	ifstream in("out", ifstream::binary);

	ptr = new char[2*sizeof(int)];

	in.read(ptr, 2*sizeof(int));

	int *buf = (int *)ptr;

	cout << buf[0] << endl;
	cout << buf[1] << endl;

	in.read(ptr, 2*sizeof(int));

	cout << buf[0] << endl;
	cout << buf[1] << endl;

	delete [] ptr;	
	in.close();

	delete [] tab[0];
	delete [] tab[1];

	delete [] tab;
}
Wystarczy zapętlić i działa. Pewnie można to ładniej napisać, ale ja sam się tego też teraz nauczyłem.
Pozdr0
dienet
[img]http://i164.photobucket.com/albums/u19/slawek15/kotekeo0lq3.jpg[/img]

Awatar użytkownika
Zielony
Użytkownik
Posty: 535
Rejestracja: 2005-03-17, 18:22
Lokalizacja: Poznań
Kontakt:

Re: [Rozw.] [C++] Zapis i odczyt dynamicznej tablicy kwadratowej

Post autor: Zielony » 2009-11-22, 12:41

Dzięki, oto mi właśnie chodziło. ;-)

Dla podanego przeze mnie przykładu zapis będzie wyglądał tak:

Kod: Zaznacz cały

 ofstream plik ("out.bin", ios::binary);

    int **tab;
    tab = new int*[10];
    for (int i = 0; i < 10; i++)
        tab[i] = new int[10];


    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
                tab[i][j] = i * j;
        }
    }

    for (int i = 0; i < 10; i++)
       plik.write ((char *) tab[i], 10 * sizeof (int));

    plik.close ();
A odczyt tak:

Kod: Zaznacz cały

    ifstream plik ("out.bin", ios::binary);

    int **tab;
    tab = new int*[10];

    for (int i = 0; i < 10; i++) {
        char *ptr = new char[10 * sizeof (int)];
        plik.read ((char *) ptr, 10 * sizeof (int));
        tab[i] = (int *) ptr;
        delete [] ptr;
    }

    plik.close ();


[ Dodano: 2009-11-22, 22:54 ]
Poprawka. Nie należy wykonywać delete na wskaźniku ptr. Rzutowanie z char na cokolwiek wcale nie tworzy nowej tablicy w innym miejscu pamięci. Miejsce w pamięci pozostaje to samo, tylko dane te są interpretowane zgodnie z typem, na który rzutujemy.
Żyję - nie każdemu się zdarza - a we krwi mam chlorofil.
[url=http://scxd.info/][img]http://scxd.info/pub/scxdbar/scxd-bar.png[/img][/url]
[b]Registered User #448882[/b]
[img]http://scxd.info/say/img.php[/img]

ODPOWIEDZ