Werte in einer Textdatei ändern?!

daflowjoe

Mitglied
Hallo, da ich C++ noch ein ziehmlich Neuling bin, scheitere ich jetzt schon an einem scheinbar einfachen Problem. ;)

Ich habe ein Programm in dem ich verschiedene Fahrzeuge mit diverser Daten hinzufügen, löschen usw. können soll. Als Backend soll dafür in eine einfache Textdatei geschrieben werden. Ich bekomm es auch soweit auf die Reihe die Daten in die Textdatei zu schreiben und alles wieder auszugeben.

Allderdings soll nach einer Berechnung von Mieterlösen(PKW-Verleih) auch noch der Kilometerstand, je nach gefahrenen Kilometern, hochgesetzt werden.

Ich scheitere also daran einen expliziten Datensatz aus der Datei zu ändern und auch einen bestimmten Datensatz zu löschen.

Ist das überhaupt über eine Textdatei realisierbar bzw wie kann ich das am geschicktesten umsetzen?

Vielen Dank schonmal im Vorraus.

Lg Joe
 
Hi.

Da es nicht möglich ist in einer Textdatei etwas einfach so einzufügen, wäre es am einfachsten einfach die komplette Datei zu überschreiben.

Gruß
 
danke erst einmal für die Antwort.

Es stimmt natürlich, dass ich die Datei auch einfach neu schreiben kann. Dann muss ich irgendwie definieren, welcher Datensatz welche id hat und wo der KM-Stand in dem String steht.

In dem ausgelsenen String stehen ja dann alle Datensätze. Ich will dann einen Datensatz dieses Strings z.b. löschen oder wie gesagt, den Kilometerstand ändern. Alldergings hab ich dazu nur eine Fahrzeugnummer. Ich hab für solche Sachen bisher nur mit SQL gearbeitet, womit das ja regelrecht bequem zu gehen scheint.

Wie kann ich also solche Selects, Delte, replaceactionen oder weis der geier was innerhalb eines Strings realisieren bzw wenigstens nachahmen?

lieber gruss joe
 
Hi.

Du kannst die Aufgabe natürlich mit "Suchen & Ersetzen" lösen. Dazu gibt es eine Menge Methoden der Klasse std::string und Funktionen die dabei behilflich sein würden: find_first_of, find, replace, substr etc.

Normalerweise würde man allerdings etwas anders an die Sache herangehen.

Die Fahrzeuge werden als Objekte gespeichert. Diese Objekte besitzen Eigenschaften und Methoden um diese Eigenschaften zu manipulieren.

Wenn man die Textdatei einliest, erzeugt man diese Objekte und speichert sie in einem Container (z.B. std::list oder std::map).

Dann manipuliert man die Objekte wie gewünscht.

Zum Schluß iteriert man über den gesamten Container und schreibt die Objekte wieder in die Datei.

Gruß
 
Hi,

ich habe vor kurzem etwas ähnliches nur mit Adressdaten gemacht. Dazu habe ich mir eine struct angelegt mit den entsprechenden Daten, zB Name, Straße, Plz usw. und hab das in eine .txt datei geschrieben. Beim öffnen des Programms liest er die Datensätze aus der Datei aus und du kannst sie einzeln anhand des Namens aufrufen. Geht das in die Richtung oder hab ich dein Problem falsch verstanden?

Gruß
Dorschty
 
ja genau das mein ich im prinzip.

hat jemand vielleicht mal ein beispiel dazu wie ich einen datensazu auslese und in eine variable speicher?

gruss joe
 
Ich bekomme ich einfach nicht den Inhalt der Datei ausgeben.
Desweiteren hab ich das Problem, dass ich nicht die ganze Stuktur schreiben kann, da diese anscheinend vom Typ char sein müssen?! Deswegen muss ich die einzelnen Eigenschaft auch einzeln schreiben und kann dabei auch kein Integer verwenden.

IM zweiten Schritt will ich die Datensätze einzeln auslesen und anzeigen, dabei wird mir jedoch ein komplett anderer wert angezeigt?!


Hat jemand eine Idee?


Code:
int add() 
{
	struct cars 
	{
		char typ[4];
		char kennzeichen[10];
		char klasse[20];
		char kilometer[6];
		char fahrzeugnummer[2];
	}autos;

cout << "Typ: ";
cin >> autos.typ;

cout << "Kennzeichen: ";
cin >> autos.kennzeichen;

cout << "Klasse: ";
cin >> autos.klasse;

cout << "Kilometer: ";
cin >> autos.kilometer;

cout << "Fahrzeugnummer: ";
cin >> autos.fahrzeugnummer;


	FILE *datei;
	datei=fopen("fahrzeuge.txt","a");
	fwrite (autos.typ, sizeof(autos.typ) ,1,  datei );
	fwrite (autos.kennzeichen, sizeof(autos.kennzeichen) ,1,  datei );
	fwrite (autos.klasse, sizeof(autos.klasse) ,1,  datei );
	fwrite (autos.kilometer, sizeof(autos.kilometer) ,1,  datei );
	fwrite (autos.fahrzeugnummer, sizeof(autos.fahrzeugnummer) ,1,  datei );
	fclose(datei);

//cout << "Das Fahrzeug wurde erfolgreich hinzugefügt!" << endl;

return 0;

}

int show() 
{
struct cars 
	{
		char klasse[20];
		char kilometer[6];
		char fahrzeugnummer[2];	char typ[4];
		char kennzeichen[10];
	}autos;
size_t result;

FILE *datei;
datei=fopen("fahrzeuge.txt","r");
result = fread (&autos, 1, sizeof(autos), datei);
fclose(datei);
cout << autos.typ;
return 0;

}
 
Hi,

also bei meinem Programm hab ich das folgendermaßen gemacht:
Hab ein globales struct angelegt

Code:
struct asatz *first;

struct asatz
{
    char name[20];
    char vorname[20];
    char strasse[20];
    unsigned nr;
    unsigned plz;
    char ort[15];
    struct asatz *next;
};

wobei du mit unsigned auch Zahlen und nicht nur char einlesen kannst.
Dann meine Funktion um aus der Datei zu laden:

Code:
void load_data()
{
    FILE *f1;

    char n[20],vn[20],s[20],o[15];
    int plz,nr;
    int result;

    if((f1=fopen(PATH,"r"))!=NULL) //Für PATH gibt es ein define mit dem Pfad
    {
        do
        {      
            result=fscanf(f1,"%s\n",n);
            if (result!=EOF) 
            {
                result=fscanf(f1,"%s\n",vn);
                if(result!=EOF)
                {
                    result=fscanf(f1,"%s\n",s);
                    if (result!=EOF) 
                    {
                        result=fscanf(f1,"%d\n",&nr);
                        if (result!=EOF) 
                        {
                            result=fscanf(f1,"%d\n",&plz);
                            if (result!=EOF) 
                            {
                                result=fscanf(f1,"%s\n\n",o);
                                if (result!=EOF) 
                                {
                                    append(n,vn,s,nr,plz,o);
                                }
                            }
                        }
                    }
                }
            }
                            
        }while(result!=EOF);
    fclose(f1);
    }   
}

die ganzen Daten gehen in eine append Funktion, die so aussieht:

Code:
void append(char n[],char vn[],char s[],unsigned nr,unsigned p,char o[])
{
    struct asatz *ptr;

    if(first==NULL)
    {
        first=(asatz*)malloc(sizeof(*first));
        strcpy_s(first->name,n);
        strcpy_s(first->vorname,vn);
        strcpy_s(first->strasse,s);
        first->nr=nr;
        first->plz=p;
        strcpy_s(first->ort,o);
        first->next=NULL;
    }
    else
    {
        ptr=first;
        while(ptr->next!=NULL)
            ptr=ptr->next;
        ptr->next=(asatz*)malloc(sizeof(*ptr));
        ptr=ptr->next;
        strcpy_s(ptr->name,n);
        strcpy_s(ptr->vorname,vn);
        strcpy_s(ptr->strasse,s);
        ptr->nr=nr;
        ptr->plz=p;
        strcpy_s(ptr->ort,o);
        ptr->next=NULL;
    }
}

Ist mit sicherheit nicht die eleganteste Lösung, da ich selbst noch ziehmlicher Anfänger bin, aber sie funktioniert immerhin ohne Probleme! ;-)
Vielleicht hilft es dir ja weiter!

Gruß
Dorschty
 
Zurück