[C++] struktur speichern?!

rook

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

z.b. eine struktur die so aus sieht:
Code:
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 :)
 
Du müsstest wohl eine Art Datenbank anlegen, also die werte in
ne Textdatei speicher und dann wieder auslesen wenn du sie
brauchst...
 
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
 
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.
Code:
#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
 
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...

Code:
#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?
 
Zuletzt bearbeitet:
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
 
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
 
Zurück