• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Problem mit Schreiben in Datei

deetee

Newbie
Hallo,

also ich schreibe verschiedene Zahlenwerte immer wieder in eine Datei und lese diese an anderer Stelle wieder aus. Beim Auslesen vergleiche ich, ob der Wert aus der Datei <=1 oder >=20 ist.

Jetzt kommt z.B. folgende Reihenfolge an Zahlen in die Datei:

10
18
12
14
9

nach jedem Schritt wird die Datei vom Dateianfang ausgelesen. Vor jedem Schreiben setze ich den Dateizeiger mit rewind() auf den Dateianfang. So wird der alte Inhalt der Datei überschrieben. Das ist gewollt.

Jetzt denkt nochmal zurück an meine Abfrage <=1 und >=20.

Wenn ich 10 auslese, dann trifft keine Bedingung zu. Bei 18, 12 und 14 auch nicht und bei 9 EIGENTLICH AUCH nicht.

Das PROBLEM ist, dass ich im letzten Schritt ständig 94 auslese.

Der Grund dafür ist, dass zwar die einstellige Zahl 9 in die Datei korrekt geschrieben wird, aber die 9 überschreibt nur die erste Stelle der zuletzt eingetragenen zweistelligen Zahl - in diesem Beispiel die 14.

Ich möchte aber, dass der KOMPLETTE Inhalt der Datei mit jedem Schreiben überschrieben wird.

Wie kann ich das am besten umsetzen?
 

SP

Member
Da du nicht schreibst, in welcher Sprache du programmierst, gehe ich einfach mal von C aus.

Du kannst die Datei im Binärmodus öffnen, dann hat ein Integer immer die gleiche Größe (auf den meisten 32-bit Systemen 4 byte).

Gruß sp
 
OP
D

deetee

Newbie
Hallo SP,

ja ich schreibe in C. Ich hab dein Tipp befolgt, aber hat nix geändert. Ich habe die Datei mit fopen(datei, "r+b") geöffnet aber der Fehler besteht nach wie vor.

Mir fallen eigentlich nur 2 Möglichkeiten noch ein:

- Datei vor dem hineinschreiben löschen und neu anlegen, damit der Inhalt komplett neu angelegt wird.

- evtl. mit jedem hineinschreiben einer Zahl auch ein \n direkt dahinter schreiben, um quasi das EOF auszulösen.


Was meint ihr dazu?
 

SP

Member
Wenn du \n anfügen willst, musst du die Datei im Textmodus öffnen. Der Binärmodus kennt keine Steuerzeichen.

Wie schreibst und liest du die Daten, nachdem du die Datei binär geöffnet hast?

Gruß sp
 
OP
D

deetee

Newbie
So lese und schreibe ich in die Datei...

Code:
			/* saving the score */
			ptfs1->fh1 = fopen(TITLE_WERT, "r+");/* open wert */
			fscanf(ptfs1->fh1, "%d", &ptfs1->sum);/* read wert */
			rewind(ptfs1->fh1);
			ptfs1->sum += iRand;
			fprintf(ptfs1->fh1, "%d", ptfs1->sum);/* write wert */
			fclose(ptfs1->fh1);/* close wert */

Mit dem Steuerzeichen \n hintendran klappt das Programm, allerdings ist mir das etwas unsauber.

Kann ich denn nicht irgendwie das komplette Überschreiben der Datei erzwingen, außer sie vorher ganz zu löschen und neu anzulegen?
 

SP

Member
Wenn du zum Öffnen das Flag w benutzt, wird die Datei gelöscht.

Wenn du die Daten binär speicherst, musst du fread und fwrite benutzen.

Gruß sp
 
OP
D

deetee

Newbie
Wenn du zum Öffnen das Flag w benutzt, wird die Datei gelöscht.
Das ist ja eben das Problem, dass nur der Dateizeiger auf den Anfang gesetzt wird, sowohl bei w+, als auch bei w oder r und r+.

Der Inhalt wird dadurch überschrieben, aber eben nur soviel auch reingeschrieben wird. Stand vorher mehr drin, so bleibt dieser MEhr Inhalt erhalten. Daher mein Problem mit der 94.

Aber das mit fread() und fwrite() und dem Binärmodus klingt vielversprechend. Muss mal schauen, denn mit fread() und fwrite() kommt ich nicht so ganz klar.

Danke jedenfalls. Hat mir sehr geholfen.
 

SP

Member
Wenn du den Wert in int score gespeichert hast, müsste das so gehen.

fwrite (&score, sizeof (int), 1, &file)

Das erste Argument ist die Anfangsadresse des Datenblocks, das zweite die blocksize, das dritte die Anzahl der Blöcke und das vierte die Datei, in die geschrieben werden soll.

Gruß sp
 

Fat_Fox

Hacker
du könntest die datei auch einfach vor jedem neuen schreiben löschen und dann ganz neu erstellen lassen...das geht natürlich nur wenn das alles nicht so furchtbar schnell gehen soll und die datei nicht riesig groß ist
 

TeXpert

Guru
Fat_Fox schrieb:
du könntest die datei auch einfach vor jedem neuen schreiben löschen und dann ganz neu erstellen lassen...das geht natürlich nur wenn das alles nicht so furchtbar schnell gehen soll und die datei nicht riesig groß ist

oder er machts richtig und schreibt einen Header davor, der sagt, wie viele Einträge mit wievielen Bytes zu lesen sind.... zusätzlich wird noch ein Trenn-zeichen (z.B. 0) definiert und fertig die Laube...
 
Oben