anfügen und auch überschreiben einer Zeile in einer txt-Datei

marylin

Grünschnabel
hallo
ich hab ein echtes problem und bin schon die ganze zeit am verzweifeln für die Lösung. Die Antworten die ich bisher hier so gelesen habe, waren sehr hilfreich und so hoffe ich auch dass ihr mir vllt helfen könnt.

Ich habe ein Art Verwaltungsprogramm geschrieben(C, visual studios), das Tischreservierungen erfasst. Zu jeder Tischnummer kann nun der Kundenname, die Zahl der Bestellungen uä gespeichert werden.
Zu Beginn fülle ich die z.b 200 Zeilen des structs (maximale Tischanzahl) mit Nullen und der aufsteigenden Tischnummer:
C:
void Tischnummer(struct Reservierung *R, int Tischanzahl)
{
int i;
int Zahl=0;

for (i=0 ;i<=Tischanzahl ;i++)
{
Zahl=Zahl+1;
R[i].Nummer=Zahl;
strcpy_s(R[i].Name,"nicht reserviert");
R[i].Essensverbrauch[1]=0;
R[i].Essensverbrauch[2]=0;
R[i].Essensverbrauch[3]=0;
}
}


Wenn ich dann die Abfrage starte und zum Beispiel die Daten von Tisch 2 und 5 eingebe und wie folgt abspeichere:

void speichern(int Tag, struct Reservierung *R, int Tischanzahl)
{
for (n=1;n<Tischanzahl;n++)
{
fopen_s(&Datei, "Tag1.txt", "a");
fprintf(Datei,"%i\t",R[n].Nummer);
fprintf_s(Datei,"%s\t",R[n].Name);
fprintf(Datei,"%i\t",R[n].Essensverbrauch[1]);
fprintf(Datei,"%i\t",R[n].Essensverbrauch[2]);
fprintf(Datei,"%i\n\n",R[n].Essensverbrauch[3]);

fclose(Datei);
}
}
bekomme ich diese Textdatei:

1 "nicht reserviert" 0 0 0
2 Horst 4 5 3
3 "nicht reserviert" 0 0 0
4 "nicht reserviert" 0 0 0
5 Hans 3 3 6
6 "nicht reserviert" 0 0 0
...
200 "nicht reserviert" 0 0 0

(soritert wie erwünscht)
Wenn ich nun aber die restlichen Tische belegen will schreibt es mir nocheinmal alle 200 zeilen mit den entsprechenden Werten, die dieses mal eingegeben wurden.

1 "nicht reserviert" 0 0 0
2 Horst 4 5 3
3 "nicht reserviert" 0 0 0
4 "nicht reserviert" 0 0 0
5 Hans 3 3 6
6 "nicht reserviert" 0 0 0
...
200 "nicht reserviert" 0 0 0
1 bernd 3 6 7
2 "nicht reserviert" 0 0 0
3 "nicht reserviert" 0 0 0
4 "nicht reserviert" 0 0 0
5 "nicht reserviert" 0 0 0
6 Heinrich 2 6 4
...
200 "nicht reserviert" 0 0 0

Meine Frage ist nun, wie ich einzelne, schon bestehende Zeilen, überschreiben kann, oder wie ich es anders anstellen könnte eine zusammenhängende, geordnete Liste zu bekommen.

Vielen Danke schonmal
 
Zuletzt bearbeitet von einem Moderator:
Hi und Willkommen bei tutorials.de,

Da die Zeilen unterschiedliche (Byte-)Längen haben
kann man sie nicht direkt in der Datei abändern
(ohne die anderen Zeilen zu "zerstören").

a)
Wenn es möglich/erlaubt ist, die Speicherart zu ändern, würde es (einfach) gehen.
Kehrseite wäre, dass der Dateiinhalt, der zurzeit im Texteditor
auch für Menschen schön lesbar ist, dort etwas seltsam ausschauen wird.

b)
Sonst: Lies die gesamte Datei ein, in ein Array etc. (Tischanzahl = Arraygröße ist ja bekannt),
änder alles Nötige im Array und schreib das ganze Array wieder in die Datei.

Für beides gilt: Damit das Neu-geschriebene die alte Datei überschreibt statt erweitert
musst du beim Öffnen "w" statt "a" angeben.

PS: Bitte Codetags verwenden.
Bzw., da die Einrückungen hier verschwunden sind,
änder deinen Beitrag, in dem du den Code nochmal reinkopierst.
Statt dem hier.
 
vielen dank schonmal für die antwort :)!

ja die speicherart darf auch geändert werden, hauptsache ist die liste kann dann später (sinnvoll leserlich) ausgedruckt werden.. gibt es da eine möglichkeit?

Die Datei in ein Array einzulesen klingt nach einer echt guten Lösung aber ich kann mir das noch nicht ganz vorstellen, ist es dann am besten jeden einzelnen tisch als array anzulegen, damit ich auf alle zugehörigen daten des tisches zugefreifen kann? Dass es dann also so eine Art Matrix gibt? Geht das?

vielen dank jetzt schon :)
 
Die Datei in ein Array einzulesen klingt nach einer echt guten Lösung aber ich kann mir das noch nicht ganz vorstellen, ist es dann am besten jeden einzelnen tisch als array anzulegen, damit ich auf alle zugehörigen daten des tisches zugefreifen kann? Dass es dann also so eine Art Matrix gibt? Geht das?

vielen dank jetzt schon :)

Hi,
ja du machst einfach ein Array mit deiner Anzahl Tischen. Und jedes Arrayelement ist ein Struct bestehend aus, Name(string), Bestellung(String) ... und was du alles brauchst. Beim Einlesen ließt du die Daten einfach in das Struct. Wobei der Index des Arrays z.B die Tischnummer bedeutet. Wenn du nun etwas änderst, musst du nur den Wert ändern. Anschließend beim abspeichern brauchst du dann auch nur die alte Datei überschreiben.
 
...hauptsache ist die liste kann dann später (sinnvoll leserlich) ausgedruckt werden.. gibt es da eine möglichkeit?

Mein Vorschlag: Schreibe vor dem Drucken alle Einträge (Spalten) in eine .txt-Datei und reserviere für jede Spalte genügend Platz (Leerzeichen). Das kannst du über die Formatanweisungen bei "fprintf" steuern.

Die txt-Datei kannst du dann mit der ShellExecute-Funktion zum Drucker senden. Bei .txt-Dateien sollte für den Ausdruck eine nichtproportionale Schrift verwendet werden, so dass du eine optisch saubere Tabelle herausbekommen solltest.
C++:
#include <shellapi.h>
#pragma comment( lib,  "shell32.lib" )

ShellExecute(NULL, "print", <pfad zur txt datei>, NULL, NULL, 0);
Gruß
MCoder
 
okay vielen lieben dank :) jetzt hab ich das mit dem array glaube ich richtig verstanden. Super so probier ichs gleich mal :)

@Mcoder ja mit diesem befehl drucke ich im moment die datei :) es ging mir nur darum dass die liste in der datei richtig geordnet wird. :)

vielen dank!
 
aber ich hätte doch noch eine frage! ist mir grade noch eingefallen. Wenn ich das "array struct" dann wieder abspeichere muss ich in der for-schleife ja den "append"-Befehl benutzen, da mir sonst ja immer wieder die erste zeile überschrieben wird und ich letztendlich dann nur die letzte zeile in der Datei stehen habe. Das heißt ich müsste die Datei vorher iwie leeren. Gibt es da eine Möglichkeit?
 
Hallo marylin,

du öffnest die Datei _einmalig_ zum Schreiben (nicht append) bevor du die for-Schleife durchläufst. Dabei werden alle in der Datei gelöscht. Dann kannst du in der Schleife alle Daten schreiben, die dann auch nacheinander in der Reihenfolge des Schreibens in der Datei landen. Danach schließt du die Datei wieder.

Gruß
MCoder
 
Zurück