Aus Datei lesen

Dieses Thema im Forum "C/C++" wurde erstellt von enr00, 23.08.2007.

  1. enr00

    enr00 Routinier

    Dabei seit:
    08.04.2007
    Beiträge:
    275
    Zustimmungen:
    0
    Ort:
    Luxemburg
    Dies sind die Teile meines Adressen-Verwaltungs-progs, die aus einer Datei laden, und darin speichern. Das mit dem Auslesen gelingt mir jedoch nicht so richtig, kann mir da jemand helfen?

    Code:
    void save(const char *pfad)
    {
         ADRES *temp = anfang;
         FILE *datei;
         char dat[MAX];
    
         sprintf(dat, "%s%s", pfad, ".adres");
         
         datei = fopen(dat, "w");
         if(datei == NULL)
                  fehler("Konnte Datei nicht öffnen.");
         
         if(temp == NULL)
         {
                 fprintf(stdout, "Noch kein Datensatz vorhanden.\n\n");
                 return;
         }
         
         while(temp != NULL)
         {
                    fprintf(datei, "%s;%s;%d;", temp->vname, temp->nname, temp->alter);
                    temp = temp->next;
         }
         fprintf(datei, "%c", '?');
         fclose(datei);
    }
    
    void load(const char *pfad)
    {
         ADRES *temp = anfang;
         FILE *datei;
         char dat[MAX], vname[20], nname[20], puffer[MAX], c;
         int alter;
    
         sprintf(dat, "%s%s", pfad, ".adres");
         
         datei = fopen(dat, "r");
         if(datei == NULL)
                  fehler("Konnte Datei nicht öffnen.");
         
         if(temp == NULL)
         {
                 anfang = temp = (ADRES *)malloc(sizeof(ADRES));
                 temp->next = NULL;
         }
         
         while((c = fgetc(datei)) != EOF)
         {
    
                    fscanf(datei, "%s;%s;%d;", vname, nname, &alter);
                    if(*vname != '?')
                    {
                              anhangen(vname, nname, alter);                
                              temp = temp->next;
                    }
         }
         fclose(datei);
    }
    und hier der vollständige Code:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX 100
    
    struct adres
    {
           char vname[20];
           char nname[20];
           char alter;
           struct adres *next;       
    };
    
    typedef struct adres ADRES;
    
    ADRES *anfang = NULL;
    
    void fehler(const char *fehler);
    void anhangen(char *vname, char *nname, char alter);
    void alles_ausgeben();
    void eingabe();
    void suche(const char *wen);
    void del(const char *wen);
    void ciao(const char *von);
    void save(const char *pfad);
    void load(const char *pfad);
    
    int main(int argc, char *argv[])
    {
      unsigned char auswahl;
      char temp[MAX];
      
      do
      {
               printf("1          Eingabe\n");
               printf("2          Alles ausgeben\n");
               printf("3          Nach Vornamen suchen\n");
               printf("4          Nach Vornamen loeschen\n");
               printf("5          In Datei speichern\n");
               printf("6          Aus Datei laden\n");
               printf("\n100        Beenden\n");
               
               scanf("%d", &auswahl);
               
               switch(auswahl)
               {
                              case 1: eingabe();
                                      break;
                              case 2: alles_ausgeben();
                                      break;
                              case 3: printf("Nach welchem Vornamen wollen sie suchen?");
                                      scanf("%s", temp);
                                      suche(temp);
                                      break;
                              case 4: printf("Elemente mit welchem Vornamen wollen sie löschen...");
                                      scanf("%s", temp);
                                      del(temp);
                                      break;
                              case 5: printf("In welche Datei soll gespeichert werden?");
                                      scanf("%s", temp);
                                      save(temp);
                                      break;
                              case 6: printf("Aus welcher Datei soll gelesen werden?");
                                      scanf("%s", temp);
                                      load(temp);
                                      break;
                              case 100: ciao("Christophe");
                                        return 0;
                                        break;
                              default: printf("Ungültige Auswahl, bitte neue Auswahl treffen...");
                                       scanf("%d", &auswahl);
                                       break;
               }
               
      }while(auswahl != 100);
      	
      return 0;
    }
    
    void fehler(const char *fehler)
    {
         fprintf(stderr, "Fehler:  %s\n", fehler);
    }
    
    void anhangen(char *vname, char *nname, char alter)
    {
         char nn[20], vn[20];
         ADRES *temp;
         
         strcpy(nn, nname);
         strcpy(vn, vname);
         
         
         if(anfang == NULL)
         {
                   anfang = (ADRES *)malloc(sizeof(ADRES));
                   anfang->next = NULL;
         }
         else
         {     
               while(temp->next != NULL)
               {
                   temp = temp->next;
               }
               temp->next = (ADRES *)malloc(sizeof(ADRES));
               temp = temp->next;
         }
               temp->alter = alter;
               strcpy(temp->vname, vn);
               strcpy(temp->nname, nn);
    }
    
    void alles_ausgeben()
    {
         ADRES *temp;
         temp = anfang;
         
         if(anfang == NULL)
         {
                 fprintf(stdout, "Noch kein Datensatz vorhanden.\n\n");
         }
         
         while(temp != NULL)
         {
                    printf("Name: %s\nVorname: %s\nAlter: %d\n\n", temp->vname, temp->nname, temp->alter);
                    temp = temp->next;
         }
    }
    
    void eingabe()
    {
         ADRES *temp;
         temp = anfang;
         int alter;
         char vn[20], nn[20];
         
         if(anfang == NULL)
         {
                temp = (ADRES *)malloc(sizeof(ADRES));
                temp->next == NULL;
                anfang = temp;
         }
         
         else
         {
             while(temp->next != NULL)
                    temp = temp->next;
                    
             temp->next = (ADRES *)malloc(sizeof(ADRES));
             if(temp->next == NULL)
                           fehler("Fehler beim reservieren des Speicherplatzes für temp->next.");
             temp = temp->next;
         }               
         printf("Bitte Vornamen eingeben...");
         scanf("%s", vn);
         
         printf("Bitte Nachnamen eingeben...");
         scanf("%s", nn);
         
         printf("Bitte Alter eingeben:...");
         scanf("%d", &alter);
         
         printf("\n\n");
         
         strcpy(temp->nname, nn);
         strcpy(temp->vname, vn);
         temp->alter = alter;
         
         temp->next = NULL;     
         
    }
    
    void suche (const char *wen)
    {
         ADRES *temp;
         int gefunden = 0;
         
         temp = anfang;
         
         while(temp != NULL)
         {
                    if((strcmp(wen, temp->vname)) == 0)
                    {
                                    printf("Name: %s\nVorname: %s\nAlter: %d\n\n", temp->vname, temp->nname, temp->alter);
                                    gefunden = 1;
                    }               
                    temp = temp->next;
         }
         
         if(gefunden == 0)
                 printf("Vorname %s nicht gefunden.\n\n", wen);
                 
    }
    
    void del(const char *wen)
    {
         ADRES *temp = NULL;
         ADRES *zeiger_delete = NULL;
         ADRES *zeiger_vor = NULL, *zeiger_nach = NULL;
         int gefunden = 0;
         
         temp = anfang;
         
         if(temp->next == NULL && strcmp(wen, temp->vname) == 0)
         {
                       free(temp);
                       temp = anfang = NULL;
         }
         
         while(temp != NULL)
         {
                    if(strcmp(wen, temp->next->vname) == 0)
                    {
                                   zeiger_delete = temp->next;
                                   temp->next = zeiger_delete->next;
                                   free(zeiger_delete);
                                   gefunden = 1;
                    }
                    
                    temp = temp->next;
         }
         zeiger_delete = temp = NULL;
         
         if(gefunden == 1)
                 printf("Vorname %s nicht gefunden.\n", wen);
    
    }
    
    void ciao(const char *von)
    {
         printf("\n\n\nCIAO\n\n\n            by     %s\n\n\n", von);
    }
    
    void save(const char *pfad)
    {
         ADRES *temp = anfang;
         FILE *datei;
         char dat[MAX];
    
         sprintf(dat, "%s%s", pfad, ".adres");
         
         datei = fopen(dat, "w");
         if(datei == NULL)
                  fehler("Konnte Datei nicht öffnen.");
         
         if(temp == NULL)
         {
                 fprintf(stdout, "Noch kein Datensatz vorhanden.\n\n");
                 return;
         }
         
         while(temp != NULL)
         {
                    fprintf(datei, "%s;%s;%d;", temp->vname, temp->nname, temp->alter);
                    temp = temp->next;
         }
         fprintf(datei, "%c", '?');
         fclose(datei);
    }
    
    void load(const char *pfad)
    {
         ADRES *temp = anfang;
         FILE *datei;
         char dat[MAX], vname[20], nname[20], puffer[MAX], c;
         int alter;
    
         sprintf(dat, "%s%s", pfad, ".adres");
         
         datei = fopen(dat, "r");
         if(datei == NULL)
                  fehler("Konnte Datei nicht öffnen.");
         
         if(temp == NULL)
         {
                 anfang = temp = (ADRES *)malloc(sizeof(ADRES));
                 temp->next = NULL;
         }
         
         while((c = fgetc(datei)) != EOF)
         {
    
                    fscanf(datei, "%s;%s;%d;", vname, nname, &alter);
                    if(*vname != '?')
                    {
                              anhangen(vname, nname, alter);                
                              temp = temp->next;
                    }
         }
         fclose(datei);
    }
    
    
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 marcellus, 23.08.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Code:
    s[B]n[/B]printf(dat, "%s%s\0", [B]MAX-1[/B], pfad, ".adres");
    
    abgesehen davon

    mit

    Code:
     scanf("%s", temp);
    
    wirds auch nix
    als erstes amal niemals unbestimmt lange stirngs einlesen, wie wärs mit getline?

    Wenns umbedingt so sein soll probier amal sowas

    Code:
    scanf("%[B](MAX-1)[/B]s", [B]&[/B]temp);
    
    Wobei ich mir nicht sicher bin, ob er (MAX-1) so ohne weiteres frisst aber ich hab jetzt kein bock da herumzuspielen
     
  4. enr00

    enr00 Routinier

    Dabei seit:
    08.04.2007
    Beiträge:
    275
    Zustimmungen:
    0
    Ort:
    Luxemburg
    Hauptproblem ist, dass ich jede Zeile parsen muss.Datei ist folgednermassen aufgebaut:

    Code:
    vorname;nachname;16;person2; nachnameperson2;17;
    Und diese Werte müssen einer verketteten Liste hinzugefügt werden.
     
  5. #4 marcellus, 24.08.2007
    Zuletzt bearbeitet: 24.08.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Wenn du ca gleich große maximale namenlängen hast kannst du die eingabe beschränken, wenn nicht musst dus dynamisch verwalten, falls du noch eine gui und das ganze leicht portierbar machen willst kannst du dir ja auch mal die glib anschauen, die bietet iirc sogar einen typ string dabei musst du dich nicht drum kümmern was du machst.

    Bzw getline allokiert auch ist aber nur für gcc verfügbar

    oder probier vllt was auf diese art
    Code:
    int i=-5;
    while(i+=5)
    {
         fgets((char+(i*sizeof(char))), 5, DATEI);
         if(NULL!=strstr(*char, ";"))
         {
               break;
         }
         if(NULL==realloc(*char, (i+5)*sizeof(char)))
         {
              fprintf(stderr, "kein speicher, bum!\n");
              break;
         }
    }
    machirgendwas(*char);
    free(*char);
    
    das am besten in einer unterfunktion mit der übergabe eines *char und dann kann man das ganze schon anschauen, btw wenn du static variablen für die pointer verwendest kannst du sie bein nächsten unterprogrammaufruf weiterverwenden, ohne jedesmal den speicher neu anzulegen und wieder freizugeben.

    Die herumspielerei mit sizeof(char) wirst du nicht brauchen, aber vergiss nicht, dass du für wide characters ich glaub int für charakters nehmen müsstest und wenn du gleich sizeof(*variable) nimmst kannst du da amal nicht einfachren, falls du auf unicode oä migrieren wolltest.
     
  6. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Aus Datei lesen

Die Seite wird geladen...

Aus Datei lesen - Ähnliche Themen

  1. Datei auslesen und fund per MAil versenden.

    Datei auslesen und fund per MAil versenden.: Hallo folgendes Script habe ich zur Zeit in Arbeit. Und zwar führe ich über "at" ein kleines Script aus was in einem Logfile nach bestimmten...
  2. Dateien auslesen und Daten systematisch angeordnet in Datei ausgeben

    Dateien auslesen und Daten systematisch angeordnet in Datei ausgeben: Guten Abend, ich hätte da mal eine Frage. Bin mir recht sicher, dass es in der Shell funktionieren sollte, aber kenne mich damit kaum aus....
  3. Script um bestimme Zeilen einer Datei auszulesen

    Script um bestimme Zeilen einer Datei auszulesen: Hallo, ich habe u.g Textfile. Daraus möchte ich für jeden Block (Beginnend mit id) eine Zeile mit der id, dem namen und den 2-4 WWPN in eine...
  4. ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern

    ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern: Hallo Leute, heute brauche ich mal einen dringenden Rat von Euch. Ich habe hier etwas mehr als 1200 PDF-Dateien (Text), die jeweils ein...
  5. Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

    Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql: Hallo Eventuell kann mir jemand bei meinem Problem helfen. Ich habe mich irgendwie total verrannt und komme nicht weiter. Die folgende...