You are not logged in.

  • Login

1

Friday, April 3rd 2009, 2:49pm

Struct unter C in Datei speichern und wieder einlesen

Ich hoffe dass man mir hier helfen kann, ich beiß mir mit meinem Kollegen hier die Zähne an unserem Programmieren-Projekt aus.

Wir haben eine kleine Datenbank programmiert, die Autos mit verschiedenen Werten aufnehmen kann (Modell, Marke, PS,...) und wollen nun eine Dateiaus- sowie eingabe realisieren.
Die Ausgabe klappt eigentlich, aber das Einlesen macht Probleme.

Da ich mich mit Programmieren nicht so gut auskenne (ist ehrlich gesagt nicht so mein Ding), weiß ich jetzt nicht genau, welchen Codeschnipsel ich hier posten soll, aber erstmal kopier ich mal den Struct hier rein:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct{ //Struktur für Daten der einzelnen Fahrzeuge anlegen
	int FID;
	char FMarke[20];
	char FModell[20];
	int FPS;
	int FKilometer;
	char FKateg[15];
	int FWert;
	char FZulassung[10];
	char FKraftstoff[10];
	char FFarbe[10];
}FAHRZEUGDATEN;


Der Code fürs Speichern sieht so aus:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
void dbspeichern()
{
	FILE* datei; 
	
	if ((datei = fopen("db.dat", "w")) != NULL)
	{
	fwrite(Fahrzeuge,sizeof(Fahrzeuge),1,datei);
	fclose(datei);
	}
	else
		printf("Die Datei kann nicht geoeffnet werden!");
}


Ich habe zwar auch schon einen Code für die Eingabe geschrieben, aber das Problem ist, dass der erste Datensatz an jede Position kopiert wird. Sprich: Wenn ich einen Fahrzeugbestand von 3 Autos habe, z.B. 1. Ford 2. Audi und 3. BMW, dann wird an alle drei Stellen der erste Datensatz hinkopiert, d.h. der Ford. So sieht der Code fürs einlesen aus:

Source code

1
2
3
4
5
6
7
8
9
10
void dbeinlesen()
{

	FILE *datei; 
	
	datei = fopen("db.dat", "rb"); 
	
	fread(Fahrzeuge, sizeof(Fahrzeuge),1,datei);
	fclose(datei);
}


Ich ahne schon, dass ich komplett auf dem Holzweg bin, vielleicht kann mir ja jemand helfen :-)

2

Friday, April 3rd 2009, 6:04pm

Na der Quellcode, den ihr hier postet, gibt schon mal passende Suchbegriffe ;)
Aber der Code fürs Speichern macht nicht das was er eurer Aussage nach machen soll ?(
Euer Code löscht bei jedem Aufruf zum schreiben den Inhalt der "db.dat"!

Hier ein Link warum da was nicht passen sollte:
http://www.cplusplus.com/reference/clibr…tdio/fopen.html

Da steht was ihr optimieren könnt damit eure Ausage mit dem Quelltext übereinkommen kann.

MfG bcc-fan

3

Friday, April 3rd 2009, 7:36pm

Wenn du binary liest, solltest du auch binary speichern :).

Source code

1
2
if ((datei = fopen("db.dat", "w")) != NULL) [...]
datei = fopen("db.dat", "rb");


Und btw für lokale Datenbanken bietet sich sqlite sehr an. Ist klein kompakt und lässt sich gut in C integrieren und ist vor allem eine richtige Datenbank mit SQL etc.
MfG

4

Friday, April 3rd 2009, 8:18pm

SQL, denke ich, ist hier nicht angesagt.

Es ist eine der typischen "Hausaufgaben"-Problemstellungen - oft schon gestellt und auch schon mehrfach in
diversen Foren bearbeitet. Das ist auch ein Grund das ich nicht wesentlich ausführlicher geworden bin.
Ein weiterer Grund Quellcode und der andere Text passen nicht - aber vieleicht hat der Aufgabensteller
ja nur die falsche Datei erwischt :D

Der Beitragssteller soll mal ein wenig Eigeninitiative zeigen und die Hinweise in den Quellcode einarbeiten ;)
Dann könnte man das Ganze schon zum laufen bringen 8)

Die Autodaten in binary - why?

MfG bcc-fan

5

Friday, April 3rd 2009, 8:33pm

SQL, denke ich, ist hier nicht angesagt.

Es ist eine der typischen "Hausaufgaben"-Problemstellungen - oft schon gestellt und auch schon mehrfach in
diversen Foren bearbeitet. Das ist auch ein Grund das ich nicht wesentlich ausführlicher geworden bin.
Ein weiterer Grund Quellcode und der andere Text passen nicht - aber vieleicht hat der Aufgabensteller
ja nur die falsche Datei erwischt :D

Der Beitragssteller soll mal ein wenig Eigeninitiative zeigen und die Hinweise in den Quellcode einarbeiten ;)
Dann könnte man das Ganze schon zum laufen bringen 8)

Die Autodaten in binary - why?

MfG bcc-fan

Weil im Textmodus das alles ganz anders gelesen wird.
Aber man kann es im Textmodus schreiben, dann muss man es aber so auch auslesen.
Aber nicht beides mischen. Daher kommen solche Fehler.
MfG

6

Friday, April 3rd 2009, 9:19pm

Ich denke mal Leerstellen wo "Zeichen" sein sollen oder komische Zeichen sind nicht so
frustierend wie das der Inhalt eurer Testdatenbank gelöscht wird ;)
Was meist in einer Fahrzeugbeschreibung drin ist passt auch in den Textmodus.

MfG bcc-fan

7

Friday, April 3rd 2009, 9:37pm

Ich denke mal Leerstellen wo "Zeichen" sein sollen oder komische Zeichen sind nicht so
frustierend wie das der Inhalt eurer Testdatenbank gelöscht wird ;)
Was meist in einer Fahrzeugbeschreibung drin ist passt auch in den Textmodus.

MfG bcc-fan


Ehm... ja.
Binary oder nicht ist ein elementarer Unterschied. Als Beispiel wird ein Zeilenende unter Windows \r\n geschrieben. Das sind 2 Zeichen.
Im Textmodus ist das eine Zeile. Im Binär-Modus liest man mehrere Zeichen. Schreib ich jetzt also eine Datei im Textmodus, wird immer pro Zeile \r\n eingefügt. Lese ich diese jetzt binary zurück, hab ich einen Fehler.

http://en.wikipedia.org/wiki/Newline

Quoted


Reading from a text file or binary file is different too as a text file is
automatically broken up into separate records as it read in based on
the location of the end-of-line markers.

http://www.linuxforums.org/forum/linux-p…les-binary.html
http://computer.howstuffworks.com/c39.htm


Davon abgesehen die Geschwindigkeit. In einem binär geöffneten File kann ich hin und herspringen wie ich möchte, in einer Textdatei nicht.

Mfg

Similar threads

Social bookmarks