Daten "satzweise" in Datei speichern -- wie?

Alles rund um die Programmierung mit Qt
Antworten
markusk21
Beiträge: 9
Registriert: 17. August 2006 02:50

Daten "satzweise" in Datei speichern -- wie?

Beitrag von markusk21 »

Hallo,
ich möchte in Qt einsteigen und bin ganz zufrieden mit meinen Fortschritten.
Allerdings komme ich an einer Stelle nicht weiter.

Ich habe ein AdressProgramm geshrieben und möchte beim speichern möglichst nur den geänderten Datensatz in der Datei ändern. Das ganze möglichst in Klartext also nicht mit QDataStream.

Die Daten sollen einfach zeilenweise abgelegt werden, also Vorname\nNachname\n etc.
Ich wollte dann nach der Index-Nummer in der Datei suchen und den Satz überschreiben.

So sieht der Ansatz bis jetzt aus:

Code: Alles auswählen

	QTextStream out(&File);
	
	QString input;
	input = out.readLine();	
	while(!(input.contains(index)) && !out.atEnd())
	{
		input = out.readLine();
		
	}
	
	out << recordStart << endl;
	out << adressenliste[index].Index << endl;
	out << adressenliste[index].Vorname << endl;
	out << adressenliste[index].Nachname << endl;
	out << adressenliste[index].Strasse << endl;
	out << adressenliste[index].Plz << endl;
	out << adressenliste[index].Ort << endl;
	out << adressenliste[index].Telefon << endl;
	out << adressenliste[index].Email << endl;
		
	File.close();
	return 0;
index ist ein int. recordStart ist ein Char das als Steuerzeichen dienen soll.

Ihr ahnt es schon: es funktioniert nicht. Der Datensatz wird einfach angehängt. Scheint einfach daran zu liegen, dass QString keine Integer umwandelt.

Hat jemand eine Idee, wie ich das zum laufen kriege?

Ich würde auch gern andere Vorschläge testen. Wie gesagt, ich will am Ende wie bei einer Datenbank nur kurz die Änderungen auf der Festplatte speichern.
Ideen?

Beste Grüße
Markus
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: Daten "satzweise" in Datei speichern -- wie?

Beitrag von macman »

markusk21 hat geschrieben:Ich wollte dann nach der Index-Nummer in der Datei suchen und den Satz überschreiben.
Dir ist aber klar das dann der Satz exakt die gleiche Länge haben muss. Du kannst nicht nachträglich eine Datei öffnen und mittendrin ein paar Bytes wegnehmen oder hinzufügen.
markusk21
Beiträge: 9
Registriert: 17. August 2006 02:50

Beitrag von markusk21 »

Ja, das ist klar.
Die Adresse ist ein struct. Also auch wenn z.B. keine Email angegeben wird bekommt das Feld eine Leerzeile in der Datei. Auch die Feldlänge ist dann egal.
Hier ein Dateiausschnitt:

Code: Alles auswählen

0
test1
test1
adresse1
plz1
ort1

email1

1
test2
test2
adresse2
plz2
ort2
telefon1

Aber wie gesagt, ich hänge nicht an dieser Methode. Leider bin ich kein Informatiker. Wenn jemand weiss, wie ich diese Idee besser verwirklichen kann, wäre ich dankbar.

G.
Markus
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

markusk21 hat geschrieben:Hier ein Dateiausschnitt:
So steht es aber nicht in der Datei, da sieht es ehr so aus:

Code: Alles auswählen

0\ntest1\ntest1\nadresse1\nplz1\nort1\n\nemail1\n\n\ntest2\ntest2\nadresse2\nplz2\nort2\ntelefon1
So wie Du es lösen willst, müßte jeder Adressblock eine feste Bytezahl groß sein, sagen wir mal 500. Du öffnest die Datei, merkst dir den Filepointer und liest die ersten 500 Byte. Ist es nicht dein gesuchter Datensatz, Filepointer merken und die nächsten 500 Byte lesen, bis Du deinen Datensatz gefunden hast.

Wenn Du einen gefunden hast, den Filepointer auf den zuletzt gemerkten setzen und deinen Block schreiben, sonst einfach an der Stelle schreiben, an der der Filepointer gerade ist. Datei schliessen, fertig.

Wenn Du natürlich weißt, an welcher Stelle der Datei dein Datensatz steht, kannst Du den Filepointer direkt setzen und schreiben. Aber auf jeden Fall müssen alle Blöcke gleich lang sein. Ist dein Datensatz zu kurz, musst Du ihn auffüllen, ist er zu lang, abschneiden.

Für deine Anwendung würde ich aber dazu abraten. Es ist einfacher die Datei komplett zu schreiben und sollte auch schnell genug sein. Wird es zuviel, sollte man dafür eine Datenbank nehmen.
Einmaliger
Beiträge: 48
Registriert: 22. Juli 2006 11:42

Beitrag von Einmaliger »

macman hat geschrieben:Es ist einfacher die Datei komplett zu schreiben und sollte auch schnell genug sein. Wird es zuviel, sollte man dafür eine Datenbank nehmen.
Sehe ich genauso. Rechne einach mal nach: Die Gesamtgröße eines Datensatzes dürfte bei unter 200 Bytes liegen. Wenn du 1000 Datensätze hast (und auch das ist eher eine Obergrenze), sind das unter 200 kb - und eine Festplatte schafft wieviel MB/Sekunde? Für größeres würde ich dann die Qt-Datenbankanbindung nutzen.
markusk21
Beiträge: 9
Registriert: 17. August 2006 02:50

Beitrag von markusk21 »

Hmm, schade.
Ich mache das erst mal so. Natürlich ist das kein Problem der Geschwindigkeit. Es war halt als Experiment gedacht.

Jedenfalls Danke für die Hinweise.
markusk21
Beiträge: 9
Registriert: 17. August 2006 02:50

Beitrag von markusk21 »

Jetzt komme ich mir aber echt doof vor.
QTextStream.readLine() kann scheinbar nicht mit Zahlen umgehen.
Wenn ich meinen "int Index" auslesen will meldet er das er QString nicht nach int umwandeln kann.
Muss ich den int-Wert etwa Byte-Weise auslesen? Dann muss ich ja auch noch testen wieviele Ziffern die Zahl hat. Das kann doch nicht sein, oder?
Einmaliger
Beiträge: 48
Registriert: 22. Juli 2006 11:42

Beitrag von Einmaliger »

markusk21 hat geschrieben:Jetzt komme ich mir aber echt doof vor.
QTextStream.readLine() kann scheinbar nicht mit Zahlen umgehen.
Wenn ich meinen "int Index" auslesen will meldet er das er QString nicht nach int umwandeln kann.
QString::toInt()
markusk21
Beiträge: 9
Registriert: 17. August 2006 02:50

Beitrag von markusk21 »

Danke.
In QString hatte ich tatsächlich nicht geguckt.
Antworten