Daten über Tastatur in Datei schreiben



  • Hallo Leute,

    ich hab da mal ein Problem....

    Ich will über die Tastatur Datensätze in eine Datei schreiben. Und zwar möchte ich mehrere Kundennamen und die dazugehörigen Kundennummern über die Tastatur eingeben und sie in die Datei schreiben.
    Später möchte ich die Datensätze auch nach der jeweligen Kundennummer aus der Datei abfragen können um sie eventuell zu ändern.
    Wie man eine Datei anlegt bzw. öffnet habe ich schon rausgefunden aber beim rest bin ich doch etwas verloren.



  • Hi,
    hier ein kleines Bespiel:

    int main()
    {
         FILE* Datei;
         Datei = fopen("Dateiname.txt","w+");
    
         char Satz[80];
    
         printf("\tIrgendein Programm\n\n");
         printf("Bitte geben Sie den Satz ein den Sie in\n");
         printf(" die Datei Dateiname.txt schreiben möchten!\n");
         gets( Satz );
    
         fprintf(Datei, "%s\n", Satz);
         printf("Und schon steht es in der Datei drin!\n")
         printf("Danke und auf Wiedersehen!\n");
    
        return 0;
    }
    

    EDIT: Ups ganz vergessen wieder cpp zu schließen :p

    Hoffe hab geholfen...
    MfG
    Cl0v3r



  • also hier mal mein bisheriger Quelltext...

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct kunde
    {
    
    int kundennr;
    char nachname[30];
    char vorname[25];
    
    } KUNDE;
    
    int main(void)
    {
    
    FILE *fp;
    
    char *filename="kunde.dat";
    
    KUNDE kunde, kunde2, kunde3;
    
    fp=fopen(filename,"wb+");
    
    if (fp==NULL)
    
    {
    
    fprintf(stderr,"\nFehler: Datei %s kann nicht "
    
    "geöffnet werden!\n",filename);
    
    return(EXIT_FAILURE);
    
    }
    
    strcpy(kunde.nachname,"Meier");
    
    strcpy(kunde.vorname,"Hans");
    
    kunde.kundennr=10;
    
    fwrite(&kunde,sizeof(KUNDE),1,fp);
    
    strcpy(kunde.nachname,"Mueller");
    
    strcpy(kunde.vorname,"Heinrich");
    
    kunde.kundennr=11;
    
    fwrite(&kunde,sizeof(KUNDE),1,fp);
    
    strcpy(kunde.nachname,"Muster");
    
    strcpy(kunde.vorname,"Ulla");
    
    kunde.kundennr=12;
    
    fwrite(&kunde,sizeof(KUNDE),1,fp);
    
    rewind(fp);
    
    printf("\nDie Datensätze in %s sind nun:\n",filename);
    
    do
    
    {
    
    if (fread(&kunde,sizeof(KUNDE),1,fp)==1)
    
    printf("%4d: %s %s\n",kunde.kundennr,kunde.vorname,kunde.nachname);
    
    } while (!feof(fp));
    
    fclose(fp);
    
    return(EXIT_SUCCESS);
    
    }
    

    Also wie ich in die Datei schreiben kann hab ich schon rausgefunden, aber nicht wie ich das ganze per Eingabeaufforderung über die Konsole eingeben/schreiben/speichern kann.

    Also:
    geben Sie einen neuen Datensatz ein...blablabla

    Name: Mustermann
    Vorname: Ulla
    Kundennr: 12345



  • Sorry aber ich verstehe deine Frage nicht richtig...

    Also wie ich in die Datei schreiben kann hab ich schon rausgefunden, aber nicht wie ich das ganze per Eingabeaufforderung über die Konsole eingeben/schreiben/speichern kann.

    Wenn du schon weißt wie du in die Datei schreibt wieso weißt du dann nicht wie du dann nicht wie du über die Eingabeaufforderung in die Datei schreibst?
    Da stimmt was nicht?!?

    Ich verstehe auch nicht wieso du die Namen in eine die Klassenvariablen schreibst wenn du sie danach sowieso wieder überschreibst.
    Dann brauchst du doch gar keine Klasse. Lass die am besten weg und nimm einfache Arrays bloß ohne Klasse.

    char *filename="kunde.dat";         // Wozu machst du das?
    fp=fopen(filename,"wb+");           // Schreib doch gleich hier "kunde.dat"
    fp = fopen("kunde.dat","wb+");      // So...
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
    
    FILE *fp;
    fp = fopen("kunde.dat","wb+");
    
    char vorname[20];
    char nachname[20];
    int kundennummer = 10;
    char Zeilen[500];
    
    if (fp==NULL)
    {
    
    fprintf(stderr,"\nFehler: Datei %s kann nicht "
    "geöffnet werden!\n",filename);
    
    return(EXIT_FAILURE);
    
    }
    printf("Vorname: ");
    gets( vorname );
    fprintf(fp,"%s\n", vorname);
    printf("Nachname: ");
    gets( nachname );
    fprintf(fp,"%s\n", nachname);
    fprintf(fp,"%d\n", kundennummer);
    
    kundennummer += 1;
    printf("Vorname: ");
    gets( vorname );
    fprintf(fp,"%s\n", vorname);
    printf("Nachname: ");
    gets( nachname );
    fprintf(fp,"%s\n", nachname);
    fprintf(fp,"%d\n", kundennummer);
    
    kundennummer += 1;
    printf("Vorname: ");
    gets( vorname );
    fprintf(fp,"%s\n", vorname);
    printf("Nachname: ");
    gets( nachname );
    fprintf(fp,"%s\n", nachname);
    fprintf(fp,"%d\n", kundennummer);
    
    rewind(fp);
    
    while(!feof(fp))
    {
    fscanf(Datei, "%s\n", Zeilen);
    printf("%s\n", Zeilen);
    }
    
    fclose(fp);
    
    return(EXIT_SUCCESS);
    
    }
    

    Hab das jetzt einfach so umgeschrieben aber der Sinn ist klar oder?
    Denn ich verstehe immer noch nicht genau was du vorhast.

    mfg
    Cl0v3r

    P.S.: SIMPSOOOONS! 😃



  • danke hilft mir schon ne ganze ecke weiter...will mich mit dateiarbeit auseinandersetzen und das ganze is nur ne übung...damit ich c lerne



  • Ja ist schon n bisschen komplizierter über die Eingabeaufforderung in eine Datei zu schreiben, musste dich eben nur ein bissel reinfuxen, dann geht das. War bei mir auch so.

    Wenn du Visual C++ von Microsoft benutzt hat mir auch die Libary sehr geholfen bzw hilft mir immernoch. Also das ist echt mal eine gute Sache die Microsoft hervor gebracht hat.

    Naja...
    Bisch dann
    Cl0v3r



  • clover, wenn er binär schreibt und die daten in stucts vorher reinpackt, dann ist das voll in ordnung.
    es gibt in ansi c keine klassen. es sind structs.
    wie du das vorschlägst, es ascii zu schreiben, ist es ineffizient



  • c.rackwitz schrieb:

    wie du das vorschlägst, es ascii zu schreiben, ist es ineffizient

    Aber halt auch lesbar (ich würde es natürlich auch binär schreiben).

    @ Cl0v3r

    Bitte nie wieder gets() benutzen -> fgets()



  • @ morrigan
    in diesem foum gibt es sicher schon 100derte threats über tatei lesen schreiben warum LEST du nicht einfach mal oder suchst dir tuts oder kaufst dir ein gutes buch denn in diesem c forum geht es zu 90% um datei lesen/schreiben dass ist irgendwie öde weil es im endeffekt immer das selbe ist... 😡 😡



  • @c.rackwitz ja meine ich ja struct 🙄 irgendwie kriege ich es nie gebacken die mal auseinander zu halten 😡
    Ja es ist in Ordnung aber es ist unnötig kompliziert.

    @TactX jedem das seine 😉

    Bisch späta...
    Cl0v3r



  • Cl0v3r schrieb:

    @TactX jedem das seine 😉

    Hör auf TactX, der Hinweis war gut und weise.

    Deine Aufgabe ist es jetzt mir zu erklären warum fgets() besser als gets() ist. Es ist ein essentieller Unterschied der mich dazu bringt gets() nur in quick'n'dirty code einzusetzen und niemals ein einer ordentlichen Anwendung.



  • Ähmm...meinst du ich soll dir erklären was besser an fgets() ist?
    Keine Ahnung deswegen benutze ich wohl noch gets(). :p

    Kommt drauf an ich benutzte eigentlich gets() immer dann wenn ich keine Lust habe viel zu tippen oder fgets() wenn ich in ein Array schreiben will.
    Denn anscheinend reserviert man mit fgets() den benötigten Speicher.
    Genau weiß ich das nicht und es wäre schön wenn man nicht immer diese encrypteten Antworten bekommt bei denen man gar nicht weiß wozu man antworten soll.
    Ich mein das nicht böse oder so, bloß wie schon gesagt "Jedem das seine".
    Klar ist gut wenn man immer mehr erfährt und auch warum man denn lieber fgets() als gets() benutzen sollte aber nicht jeder weiß alles.

    Wie mein Opa immer zu sagen plegt: "Ne jut jebratene Janz ist ne jute Jabe Jottes."
    😃

    mfg
    Cl0v3r



  • Cl0v3r schrieb:

    Ähmm...meinst du ich soll dir erklären was besser an fgets() ist?
    Keine Ahnung deswegen benutze ich wohl noch gets(). :p

    Naja, das war eher ein Hinweis: mach dich mal schlau was der Unterschied ist, er ist nämlich signifikant.

    Kommt drauf an ich benutzte eigentlich gets() immer dann wenn ich keine Lust habe viel zu tippen

    gets(name);
    fgets(name, len, stdin);

    mhm... so viel ist das nicht.

    oder fgets() wenn ich in ein Array schreiben will.

    Ein string ist nichts anderes als ein array aus char

    Denn anscheinend reserviert man mit fgets() den benötigten Speicher.

    Nein.

    Genau weiß ich das nicht und es wäre schön wenn man nicht immer diese encrypteten Antworten bekommt bei denen man gar nicht weiß wozu man antworten soll.

    Es wurde schon sooft geklärt, dass ich wenig Lust habe es nochmal zu erklären. Versuch dich schlau zu machen, benutz google, sieh in deine Dokumentation, durchscuhe das Forum (falls die Suchfunktion gehen sollte, ka ob sie es tut)

    Falls du wirklich nichts findest, erkläre ich es dir gerne - ich versuche hier eigentlich nur etwas eigeninitiative anzustacheln...

    wie schon gesagt "Jedem das seine".

    Naja, jedem das seine passt nicht ganz. Denn gets() ist klar eine Sicherheitslücke (gcc warnt dich zB bei der Verwendung). Egal was du machst, sobald du gets() im Code hast, kannst du opfer eines Bufferoverflows werden - das ist nicht nett.



  • Shade Of Mine schrieb:

    Kommt drauf an ich benutzte eigentlich gets() immer dann wenn ich keine Lust habe viel zu tippen

    gets(name);
    fgets(name, len, stdin);

    mhm... so viel ist das nicht.

    Wenn ich das öfters benutze schon.

    Shade Of Mine schrieb:

    Genau weiß ich das nicht und es wäre schön wenn man nicht immer diese encrypteten Antworten bekommt bei denen man gar nicht weiß wozu man antworten soll.

    Es wurde schon sooft geklärt, dass ich wenig Lust habe es nochmal zu erklären. Versuch dich schlau zu machen, benutz google, sieh in deine Dokumentation, durchscuhe das Forum (falls die Suchfunktion gehen sollte, ka ob sie es tut)

    Ich bin noch nicht lange hier im Forum.

    Ich habe dich übrigens nicht darum gebeten das du mir erklärst was der Unterschied ist, schließlich hast du mir gesagt ich soll dir erklären was der Unterschied ist, denn bis vor kurzem hat mich das auch nicht interessiert und ich wußte nicht das die Unterschiede so gravierend sind.
    Jetzt weiß ich aber das die Unterschiede (anscheinend) so heftig sind und jetzt werde ich mich auch schlau machen.

    mfg
    Cl0v3r



  • ist es eigentlich sinnvoll wenn man hier noch mal prüft ob die datei NULL ist?

    void erstellen(void)
    {
    
    	printf("Geben Sie bitte den Namen der zu erstellenden Datei ein: \n");
    	scanf("%s",datnam);
    	dat = fopen (datnam,"wb+");
    
    	if (datnam==NULL)
    
        {
    
            fprintf(stderr,"\nFehler: Datei %s kann nicht erstellt werden!\n",datnam);
    
        } 
    
    }
    


  • Wenn dann musst du "dat" (dein Filepointer, FILE*) auf NULL überprüfen und nicht "datnam" (den string der den Dateinamen enthält). "datnam" solltest du wenn dann schon überprüfen, bevor du versuchst die Datei zu öffnen. Das machst du dann aber mit strlen().

    Außerdem macht die Funktion so nicht viel Sinn. Du solltest dann schon den FILE* auch zurückgeben.



  • aber mal anders gefragt: in welchen fällen würde das programm mir denn sagen das die datei nicht erstellt werden konnte?



  • Mal angenommen du hast "datnam" deklariert (fehlt in dieser Fkt. noch), dann nur wenn "datnam" NULL wäre (also ein Nullzeiger).



  • die funktion ist nur ein teil des quellcodes und deklariert hab ich vorher...funktioniert ja auch so wie es soll. wollt nur wissen ob ich auf diese überprüfung bei der erstellung der datei verzichten kann, denn zum öffnen einer datei, hab ich ne andere funktion eingebunden...


Anmelden zum Antworten