# [C++] struktur speichern?!



## rook (28. April 2003)

ist es möglich eine struktur auf den datenträger zu speichern?

z.b. eine struktur die so aus sieht:

```
struct Test
{
     char *name;
     int age;
};
```


ist es nun möglich wenn in der struktur nun werte gespeichert sind, die struktur auf die festplatte zu schreiben, so das man sie z.b. von einem anderen programm wieder lesen kann, und dann die struktur verwenden?

wenn ja würde ich gerne wissen wie


----------



## Sinac (28. April 2003)

Du müsstest wohl eine Art Datenbank anlegen, also die werte in
ne Textdatei speicher und dann wieder auslesen wenn du sie
brauchst...


----------



## Christian Fein (28. April 2003)

Du kannst ganze Objecte bzw auch structs binär speichern und binär wieder auslesen.

Das lesende Programm muss den Typ natürlich kennen, sprich braucht die header des typs.

Eine andere möglichkeit währe, was sich hier anbieten würde in plaintext zu speichern. 
z.b bietet sich xml an.

Das garantiert das mann gespeicherte informationen mit sämmtlichen Programmiersprachen wieder einlesen kann


----------



## rook (28. April 2003)

könntest du mir vieleicht ein beispiel zeigen, mit dem binär speichern und laden?


----------



## Daniel Toplak (28. April 2003)

Warum nicht einfach mit fwrite/fread speichern und lesen:

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

Mit fwrite kann man ohne probleme eine Struktur in eine Datei schreiben bzw. mit fread wieder einlesen.
Bei einlesen muss natürlich die Struktur bekannt sein, s.o.

```
#include <stdio.h>
#include <string.h> 
.
 .
 .
struct Test
{
     char name[20];
     int age;
};

 .
 .
 .
Test myTest;
myTest.age = 99;
strcpy(myTest.name, "Egon\0");
FILE* datei = fopen("c:\test.txt", "w");
fwrite(&myTest, sizeof(Test), 1, datei);
fclose(datei);
```

So oder so ählich lässt sich das verwirklichen.

Gruss Homer


----------



## rook (29. April 2003)

dann hab ich jetzt noch ein problem... ich poste einfach mal die ganze source, weil ich denke das man aus den einzelheiten nicht schlau wird.... das programm ist nur ein test...


```
#include <windows.h>
#include <stdio.h>
#include "resource.h"

#define FileName "c:\\test.dat"

struct SShot
{
	char test[5];
	HDC		hdc;
	HBITMAP hbmp;
	int		w, h;	
};

SShot *Main = NULL;

BOOL CALLBACK MainProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

	switch(message)
	{

		case WM_PAINT:
			PAINTSTRUCT ps;
			HDC hdc;
			hdc = BeginPaint(hwnd, &ps);
			
			if(Main != NULL)
			{
				if(!SelectObject(Main->hdc, Main->hbmp))
					MessageBox(0, "SelectObject() Failed", "WARNING!", MB_OK | MB_ICONWARNING);

				BitBlt(hdc, 0, 0, Main->w, Main->h, Main->hdc, 0, 0, SRCCOPY);
			}
			else
			{
				TextOut(hdc, 20, 20, "Failed", 6);
			}

			EndPaint(hwnd, &ps);
			break;

		case WM_CLOSE:
			EndDialog(hwnd, 0);
			break;

	}
	return false;
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{

	FILE	*pFile;
	SShot	*s = new SShot;
	char temp[255] = {""};

	if(MessageBox(0, "Take Snapshot?", "", MB_YESNO | MB_ICONQUESTION) == IDNO)
	{
		pFile = fopen(FileName, "r");
		fread(&Main, sizeof(SShot), 1, pFile);

		if(pFile != NULL)
		{
			sprintf(temp, "W: %i, H: %i\nTEST: %s", Main->w, Main->h, Main->test);
			MessageBox(0, temp, 0, MB_OK);
			DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, MainProc);
			fclose(pFile);
		}
		else
			MessageBox(0, "File Not Found!", "Error", MB_OK | MB_ICONERROR);

		exit(0);
	}

	HWND	hwnd;
	HDC		hdc;

	s->w = GetSystemMetrics(SM_CXSCREEN);
	s->h = GetSystemMetrics(SM_CYSCREEN);

	hwnd	= GetDesktopWindow();

	hdc		= GetDC(hwnd);
	
	s->hdc	= CreateCompatibleDC(hdc);
	s->hbmp	= CreateCompatibleBitmap(hdc, s->w, s->h);

	SelectObject(s->hdc,s->hbmp);
	BitBlt(s->hdc, 0, 0, s->w, s->h, hdc, 0, 0, SRCCOPY);

	ReleaseDC(hwnd, hdc);

	strcpy(s->test, "bla");

	pFile = fopen(FileName, "wb");
	fwrite(&s, sizeof(SShot), 1, pFile);
	fclose(pFile);

	Main = s;

	sprintf(temp, "W: %i, H: %i\nTEST: %s", Main->w, Main->h, Main->test);
	MessageBox(0, temp, 0, MB_OK);
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, MainProc);

	return 0;
}
```

also, wenn ich auf ja klicke, soll er mir ein screenshot von desktop machen, diesen speichern und anzeigen... das fuzt auch wunderbar... wenn ich auf nein klicke, soll er die struktur laden und dann solte er mir auch ein screen anzeigen?! bin ich mir nicht sicher... aber da ist mir dann was ganz anderes aufgefallen.... zum test hab ich die variable "test" in die struktur eingefügt, umzu schaun ob beim lesen der struktur keine fehler kommen, und siehe da... "test" hat nicht den wert, den es eigentlich haben sollte... genauso "w" und "h", haben einen sehr hohen minus wert(nicht initialisiert), dennoch ist die struktur != NULL...

warum klappt das nicht?


----------



## Thug_Angel (10. Februar 2005)

hab noch eine frage, kann mir hier jemand helfen und zwar will ich:

eine/zwei *.txt datei laden und die beiden vergleichen --> punkte statistik, --> wieviel punkte differenz ist und wenn das im minus bereich ist dan rot ansonsten weis, und das der den prozentualen punkte gewinn gemacht hat
wenn ich z.b.

tag 1 : 1 Punkt
tag 2 : 100 Punkte

das er das ung so anzeigt
Punkte alt | Punkte neu | Differenz | Prozent
1 | 100 | 99 | 100%
50 | 100 | 50 | 50%
:
:
:

P.S. das sind nicht die farbe die er ausgeben soll, nur damit man es leichter lesen kann 
aber ich will nur wissen wie ich das mache, wenn ich die punkte und namen in zwei verschiedene *.txt dateien kopiere, das ich die beiden addressen angebe und er das alles ausrechnet, es sind mehrere punkte 

Danke vielmals 

mfg
Thug_Angel


----------



## Tobias K. (10. Februar 2005)

moin


Was genau ist denn dein Problem?

Generell das laden aus Dateien?
Das Laden von bestimmten Stellen in einer Datei?

Das Ausrechnen (erst von einem srting in eine Zahl umwandeln)?


mfg
umbrasaxum


----------



## Thug_Angel (10. Februar 2005)

die dateien laden, mit den dateien arbeiten, und das in ein neues *.txt dokument speichern.


----------



## Tobias K. (10. Februar 2005)

moin


Dann solltest du die Suchfunktion des Boards nutzen, du wirst nützliches finden.


mfg
umbrasaxum


----------



## Kachelator (10. Februar 2005)

Thug_Angel, da muss ich noch einen draufgeben.

Warum erstellt du keinen neuen, in Hinsicht auf dein Problem vernünftig benannten Thread , anstatt hier ein Follow-Up auf einen uralten, nicht direkt mit deiner Frage zusammenhängenden Thread auf's Parkett zu legen? Damit tust du dir keinen Gefallen.


----------

