[C] - Erstellen von Dateien und Inhalte einfügen



  • Hallo,

    ich habe die Aufgabe, ein Programm zu schreiben, welches über ein kleines Menu eine simple Datensatzverwaltung vornimmt. Ich soll also eine Datei anlegen und darin Inhalte einpflegen bzw diese auslesen.

    Das Menu funktioniert, das Erstellen von der Datei auch, aber das wars dann auch schon.

    Es wäre super, wenn mal jemand einen kleinen Blick drüber werfen könnte. Weiß auch nicht, ob ich die richtigen Header-Files eingebunden habe.

    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct satztyp {
           char name[30];
           char vorname[20];
           char adresse[50];
           }dsatz;
    
    struct satztyp satz;
    FILE *fp;
    int run = 0;
    char input[]=""; 
    char fname[100];
    
    //Prototypen
    void menu();
    void neu();
    void update();
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    int main (int argc, char ** argv){ //int argc, char ** argv
        menu();
        while (run==0) {
              system("color 0F");         
              printf("\nEingabe: ");
    		  scanf("%s", &input);
    		  printf("\n");
    
              if(strcmp(input,"0")==0) {
                      //new file
                      neu();
              }
    		  else if(strcmp(input,"1")==0) {
                      //edit file
                      update();
              }
              else if(strcmp(input,"2")==0) {
                      //print files
                      printf("Funktionsaufruf Ausgeben\n");
              }
              else if(strcmp(input,"3")==0) {
                      printf("\nProgramm beendet!\n");                      
                      run = 1;
              }
              else if (strcmp(input,"3")>0) {
                      system("color 0C"); 
                      printf("\nFehlerhafte Eingabe\n");
              }
         }   
    
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    void menu() {
        printf("\n");    
    	printf("***********************************************\n");
    	printf("*                                             *\n");
    	printf("*     Programm: Datei-Management              *\n");
    	printf("*     -----------------------------           *\n");
    	printf("*     Eingabe:  [0] (neue Datei anlegen)      *\n");
    	printf("*               [1] (Datei bearbeiten)        *\n");
    	printf("*               [2] (Datensaetze ausgeben)    *\n");
        printf("*               [3] (Programm beenden)        *\n");
    	printf("*                                             *\n");
    	printf("*                                             *\n");
    	printf("***********************************************\n");
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    void neu() {
         printf("Dateinamen eingeben\n");
         scanf("%s",fname);
         fp = open(fname, O_CREAT|O_WRONLY); //O_CREAT|O_WRONLY
         printf("\nDONE\n");
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    void update() {
         printf("\nName -> ");
         fgets(dsatz.name,30,stdin);
         dsatz.name[strlen(dsatz.name)-1] = '\0';
         fseek(fp,0,SEEK_END);
         fwrite(&dsatz,sizeof(struct satztyp),1,fp);
         fclose(fp);
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    

    Es werden mir auch einige Fehler angezeigt (mit denen ich nicht wirklich genau etwas anfangen kann), obwohl das Programm dennoch startet:

    In neu(): [Warning] assignment makes pointer from integer without a cast
    In Update(): [Warning] passing arg 1 of fseek' from incompatible pointer type; [Warning] passing arg 4 offwrite' from incompatible pointer type;
    [Warning] passing arg 1 of `fclose' from incompatible pointer type

    LG



  • open gibt es nicht in C (sondern fopen ) und du verwendest fwrite und fclose falsch.



  • ich denke schon, ist nur etwas veraltet?!
    jedenfalls bringt fopen keine veränderung 😕

    edit:
    die funktion update hab ich etwas abgeändert, aber das scheint immer noch nicht der schlüssel zu sein:

    void update() {
         printf("\nName -> ");
         fgets(dsatz.name,30,stdin);
         dsatz.name[strlen(dsatz.name)-1] = '\0';
         fseek(fp,0,SEEK_END);
         fwrite(&dsatz,sizeof(struct satztyp),1,fp);
         fclose(fp);
    }
    

    springt an der stelle ausm programm
    (benutze im übrigen dev-c++ unter windows)



  • Wenn du fopen verwendest, ist der zweite Parameter ein string (respektive char*). Eine veroderung dürfte da interessante Effekte zeigen, ohne dass ich den Inhalt der Variablen/Makros kenne.

    FILE *pFile;
    pFile = fopen("Datei.txt","r");
    

    Ich glaube, lesen funktioniert fast immer, aber wenn du schreiben willst, muss das auch in dem Modus (=2. Parameter) angegeben sein.



  • Da stimmt einiges nicht, z.B. input war nicht ausreichend dimensioniert,
    wenn du auch in eine Datei schreiben willst, darfst du natürlich nicht Modus "r" wählen, stattdessen lieber "a", wobei du dir dann fseek sparen kannst, denn alle Schreiboperationen passieren dann automatisch am Dateiende, die Datei wurde nach dem 1. Schreibversuch geschlossen(!), sämtliche Rückgabewerte werden nicht ausgewertet usw...
    Ich würde mal sagen, 3-.
    Globale Variablen zu verwenden, ist unschöner Stil und wirklich nur anzuwenden, wenn es gar nicht anders geht.

    typedef struct {
           char name[30];
           char vorname[20];
           char adresse[50];
           }DSatz;
    
    DSatz dsatz;
    FILE *fp;
    int run = 0;
    char input[100];
    char fname[100];
    
    //Prototypen
    void menu();
    void neu();
    void update();
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    int main (int argc, char ** argv){ //int argc, char ** argv
        menu();
        while (run==0) {
              system("color 0F");        
              printf("\nEingabe: ");
              scanf("%99s", input);
              printf("\n");
    
    					switch(*input) {
    						case '0': neu();break;
    						case '1': update();break;
    						case '2': printf("Funktionsaufruf Ausgeben\n");break;
    						case '3': printf("\nProgramm beendet!\n");run = 1;fclose(fp);break;
    						default:  system("color 0C");printf("\nFehlerhafte Eingabe\n");
              }
         }  
    
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    void menu() {
        printf("\n");    
        printf("***********************************************\n");
        printf("*                                             *\n");
        printf("*     Programm: Datei-Management              *\n");
        printf("*     -----------------------------           *\n");
        printf("*     Eingabe:  [0] (neue Datei anlegen)      *\n");
        printf("*               [1] (Datei bearbeiten)        *\n");
        printf("*               [2] (Datensaetze ausgeben)    *\n");
        printf("*               [3] (Programm beenden)        *\n");
        printf("*                                             *\n");
        printf("*                                             *\n");
        printf("***********************************************\n");
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    void neu() {
         printf("Dateinamen eingeben\n");
         scanf("%99s",fname);
         fp = fopen(fname, "a+b"); //O_CREAT|O_WRONLY
         printf("\nDONE\n");
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    void update() {
         printf("\nName -> ");
         scanf("%29s",dsatz.name);
         fwrite(&dsatz,sizeof dsatz,1,fp);
    }
    

Anmelden zum Antworten