Hilfe! Schulprojekt: .txt per c++ editieren, Zeilen löschen
-
Mhhh, struct sagt mir momentan recht wenig. An meinem Problem,wie ich überhaupt suchen/löschen kann, hilft mir das nicht? ODer geht das alles mit diesem "struct"
Bin in C eher ein fortgeschrittener Anfänger, als ein wirklicher Könner
-
Hallo, also die Ausgabe klappt jetzt auch. Ganz ohne struct.Allerdings gelingt mir die Löschung nicht. Wie heißt denn da der Befehl den ich verwenden könnte?
#include <conio.h> #include <iostream.h> #include <stdio.h> #include <stdlib.h> void hinzufuegen(); //Vorankündigung der Funktion void editieren(); //Vorankündigung der Funktion void loeschen(); //Vorankündigung der Funktion //----------------------------------------------------------------------------/ void hauptmenue()//Aufruf der Funktion Hauptmenue { clrscr(); //Bildschirm leeren char wahl[1]; //Variable für die Menueauswahl cout << "- - - - - Hauptmenue - - - - -\n\nBitte Menuepunkt waehlen!\n\n"; cout << "( 1 ) - Geburtstag hinzufuegen\n"; cout << "( 2 ) - Geburtstag editieren\n"; cout << "( 3 ) - Geburtstag loeschen\n"; cout << "( 4 ) - Beenden\n\n"; cout << "Bitte Auswahl treffen: "; wahl[0]=getch(); if (wahl[0]=='1'){hinzufuegen();} //Wenn Menuepunkt 1 gewählt, Aufruf Hinzufuegen if (wahl[0]=='2'){editieren();} //Wenn Menuepunkt 2 gewählt, Aufruf Editieren if (wahl[0]=='3'){loeschen();} //Wenn Menuepunkt 3 gewählt, Aufruf Loeschfunktion if (wahl[0]=='4'){;} //Programm beenden } //----------------------------------------------------------------------------/ void hinzufuegen()//Funktion Hinzufuegen { clrscr(); //Bildschirm leeren char name[50]; char vorname[50]; char tag[5]; char ja[1]; // Variable für Abfrage: Eingabe korrekt Ja/Nein cout << "- - - - - Geburtstag hinzufuegen - - - - -\n\n"; cout << "Hinweis: Bitte keine Umlaute verwenden\n"; FILE *fp; fp=fopen("geburtsdaten.geb","a"); //Aufruf der Datenbank-Datei cout << "\nHausname: "; gets(name); cout << "\nVorname: "; gets(vorname); cout << "\nHinweis: Die Datumeingabe erfolgt aus Datenschutzgruenden ohne Jahreszahl!"; cout << "\nDatum (Formbeispiel: 31.12) : "; gets(tag); cout << "\n\nIhre Eingabe lautete: "<< name<<" "<< vorname <<" "<< tag; cout << "\n\nSind diese Angaben korrekt? \n( j ) Ja\n( n ) Nein (Eingabe wiederholen)\n( a ) Abbrechen"; ja[0]=getch(); //Fängt die Auswahl "Angaben korrekt?" auf if (ja[0]=='j'||ja[0]=='J') //Beginn der Auswertung { fprintf(fp,name); //Eingegebene Daten werden in die Datei geschrieben fprintf(fp," "); fprintf(fp,vorname); fprintf(fp," "); fprintf(fp,tag); fprintf(fp,"\n"); fclose(fp); } if (ja[0]=='n'||ja[0]=='N') { hinzufuegen(); //Neuaufruf der Funktion } else { hauptmenue(); //Zurück zum Hauptmenue } } //----------------------------------------------------------------------------/ void loeschen()//Funktion Loeschen { char vorname[30]; char tag[5]; clrscr(); //Bildschirm leeren int i=0; // Zählervariable für die Zeilen int zeile=0; // Zeilenauswahl cout << "- - - - - Datensatz loeschen - - - - -\n\n"; cout << "Nr. Name\n"; FILE *fp; fp=fopen("geburtsdaten.geb","rt"); //Aufruf der Datenbank-Datei if (fp==NULL) cout<< "Fehler"; //Fehlerausgabe wenn Datei leer else while (!feof(fp)) // feof = (funtion) end of file (Ende der Datei) { char name[30]; name[0]=' '; //Der erste Array wird bei jedem Durchlauf leer gemacht, //um später überprüfen zu können,ob die Datei schon zu Ende ist... i=i++; // Zählvariable für die Zeilenzahl fscanf(fp,"%s",name); // %s steht für Platzhalter string, Name wird eingelesen if (name[0]!=' ') //Wenn ein Name eingelesen wurde,gehts in die Schleife { fscanf(fp,"%s",vorname); fscanf(fp,"%s",tag); cout << i << ") " << name << " " << vorname << " " << tag << "\n"; //Zeilenweise Ausgabe } } fclose(fp); // FILE wird geschlossen cout << "\n\nWelchen Datensatz moechten sie loeschen? (0=Abbruch)\n"; cin >> zeile; if (zeile==0){hauptmenue();} //Wenn 0 gewählt wurde gehts zurück ins Hauptmenue fp=fopen("geburtsdaten.geb","r+"); //fscanf läuft jetzt mehrfach zeilenweise durch, //um den Cursor an die richtige Stelle zu bringen for(int x=0;zeile>x;x++){ fscanf(fp,"%s",vorname); // 3 Abfragen ohne Sinn,einfach um den Cursor zu bewegen fscanf(fp,"%s",vorname); fscanf(fp,"%s",vorname); cout << " Durchlauf:" << x <<" Zeile:"<< zeile <<"\n"; } cout << "\n Loeschung muss jetzt erfolgen!"; //Wie heißt der Löschbefehl,um die Zeile zu löschen? cout << "\n Loeschung erfolgreich,wenn ich den Befehl wuesste!"; fclose(fp); getch(); hauptmenue(); } //----------------------------------------------------------------------------/ void editieren()//Funktion Editieren { clrscr(); //Bildschirm leeren cout << "- - - - - Datensatz editieren - - - - -\n\n"; cout << "Hinweis: Funktion nicht aktiv\n"; getch(); hauptmenue(); } //----------------------------------------------------------------------------/ main(){ hauptmenue(); }
Ich habe die Stelle gekennzeichnet an der die Löschung erfolgen müsste.
-
Du kannst nicht direkt in einer datei löschen du kannst sie höchstens überschreiben deshalb funktioniert das auch nciht so wie du dir das vorstellst. die einfachste möglichkeit ist wie gesagt ein array von allen einträgen vorzuhalten und die datei jedesmal komplett neu zu schreiben.
-
bisher kenne ich ein array nur so:
char name[20][20]; name [1][1]='H'; name [1][2]='A'; name [1][3]='L'; name [1][3]='L'; name [1][3]='O';
Wie kann ich denn einen kompletten Namen in so ein array speichern, weil wenn ich dich recht verstehe müsste ich das ja praktisch in einer Art tabellenform einlesen?
-
Meine oben natürlich [1][4] und [1][5] usw...
Kleiner "Kopier-" Fehler...
-
Im Prinzip muss ich nur eine Sache wissen:
Ich habe eine Datei test.geb.
Ich weiß,dass der User die 4. Zeile der datei komplett gelöscht haben möchte.Wie heißt der C befehl um die Datei zu laden und dann direkt die 4. Zeile zu löschen? So eine Funktion muss es doch geben?
-
ein array sind einfach "viele variablen des gleichen types unter einem namen zusammengefasst"...
wenn du in c einen string darstellen willst brauchst du dafür ein array von chars, da ein char selber nur ein einzelner buchstabe ist (wenn du wirklich c++ verwenden willst kannst du dir dieses problem auch ersparen indem du ein std::string verwendest)...
wenn du nun mehrere "strings" verwenden willst brauchst du ein array von strings also ein 2dimenionales array von chars... versuch dir das mal verständlich zu machen...
was ich mit dem struct meinte war sowas in der art...
typedef struct{char name[30],int alter}person;
damit definierst du dir quasi einen neuen datentyp person mit den eigenschaften name und alter...
also z.b.
person p; sprintf(p.name,"Walter"); p.alter=33;
von einem solchen struct müsstest du dann halt ein array vorhalten um dann quasi eine menge von datensätzen zu speichern... diese kannst du dann immer komplett in einer schleife in eine datei schreiben und wenn du was löschen willst dann löchst du den datensatz aus dem array und nicht aus der datei...
-
Hallo, ich habe testweise mal deine Zeilen in mein Programm kopiert:
typedef struct{char name[30],int alter}person; person p; sprintf(p.name,"Walter"); p.alter=33;
Ich erhalte folgende Fehlermeldungen vom Compiler:
Fehler: geburtstagseingabe.cpp(8,26):Declaration terminated incorrectly
(Zeigt er bei der typedef Zeile an)
Fehler: geburtstagseingabe.cpp(146,8):'alter' is not a member of 'person'
-
ja fehler im struct
typedef struct{char name[30];int alter;}person;
-
Oh, mann. Ich muss dich ja zu Tode nerven, aber ich schaffs einfach nicht.
Ich habe begriffen,das ein String aus mehreren char´s besteht.Jetzt konnte ich mir mit deiner Hilfe mit struct einen eigenen Datentyp erschaffen. Danke,erstmal dafür
typedef struct{char name[30];char vorname[30];char tag[5];}datensatz; datensatz der; sprintf(der.name,"Mustermann"); sprintf(der.vorname,"Max"); sprintf(der.tag,"20.12");
Aber ich komme jetzt nicht drauf,wie ich ihn mehrdimensional bekomme?
Wenn ich datensatz der[10]; schreibe ,gibts nur Blödsinn...
Denn wenn ich jetzt eine Textdatei auslesen und in diesem neuem Datentyp speichern will,muss ich das ganze ja in eine Schleifenstruktur packen. In der lese ich dann mit fscanf die einzelnen Datenzeilen aus und speichere sie dann direkt in meinem Datentyp.Damit ich mehrere reinspeichern kann,muss ich den Datentyp ja aber mehrdimensional machen,und die Schleife zählt dann die Dimensionen hoch...
-
erstmal eine kleine anmerkung... wenn ein char-array ein string repäsentieren soll muss es immer nullterminiert sein... soll heissen wenn du 5 zeichen in ein string reinschreiben willst musst das char-array mindestens 6 zeichen lang sein damit es passt... dein datum verstösst gegen diese regel wenn du
sprintf(der.tag,"20.12"); aufrufst...auch würde ich datum dann ggf z.B. als eigenen datentypen definieren...
typdef struct{int tag;int monat;int jahr;}datum_t; typedef struct{char name[30];char vorname[30];datum_t date;}datensatz;
Denn wenn ich jetzt eine Textdatei auslesen und in diesem neuem Datentyp speichern will,muss ich das ganze ja in eine Schleifenstruktur packen. In der lese ich dann mit fscanf die einzelnen Datenzeilen aus und speichere sie dann direkt in meinem Datentyp
ja musst du... schreib dir einfach eine mehtode readfile die die datensätze in dein datensatzarray einliest... eine mehtode die das array komplett in der datei speichert und eine methode die dir nen datensatz aus dem array löscht...
-
#include <iostream>
#include <string>int main ()
{
string text;
cout <<"Eingabe des Textes:";
getline (cin, text);
cout<<text<<endl;
return 0;
}Probiers mal damit.
-
Es geht ja gerade drum,dass ich nicht weiß wie ich die Daten jetzt in ein Array schreibe.
Ich würde es so ähnlich versuchen:typedef struct{char name[30];char vorname[30];char tag[6];}datensatz; int zaehler=0; FILE *fp; fp=fopen("geburtsdaten.geb","rt"); //Aufruf der Datenbank-Datei while (!feof(fp)) { char test[30]; fscanf(fp,"%s",test); datensatz der[zaehler]; sprintf(der.name,test); zaehler++; } fclose(fp);
Aber so geht es nicht,weil der Array vermutlich falschgesetzt ist!?
-
da du es ja eher c-like machen willst (in c++ könnte man sich die sache mit std::strings und überladung von << und >> sehr viel einfacher machen jedoch verlangt das dann schon ein bisschen tiefergehende programmierkenntnisse) würde ich dir beim auslesen emfehlen z.b. strtok zu verwenen.... du schreibst in jede zeile deiner datei einen datensatz... zum einlesen nimmst du dann fgets und liest immer eine komplette zeile ein und lässt dir die einzelnen bestandteile dann mit strtok separieren....
-
Bleibt immer noch das "Abspeicher"-Problem...
-
Bleibt immer noch das "Abspeicher"-Problem...
Wiso das abspeichern ist doch einfacher als das einlesen...
in etwa in der art...
typedef struct{char name[30];char vorname[30];char tag[6];}datensatz int saveFile(const char* filename,datensatz *d, int n){ FILE *fp; int i; if(!(fp= fopen(filename;"w")))return 1; for(i=0;i<n;++i) fprintf(fp,"%s;%s;%s\n",d[i].name,d[i].vorname,d[i].tag); fclose(fp) return 0; }