Datensätze aus txt lesen
-
hmm ich kriegs einfach net hin. also die txt datei hat folgendes layout:
2 // Anzahl abgespeicherter Datensätze 00001 // und dann halt so wie oben schon beschrieben mustermann bernd 01.01.1980 00002 musterfrau brigitte 02.10.2009
und dann will ich das halt so abspeichern:
fscanf(fp, "%i\n\n", &AnzDat); while (i<AnzDat){ fscanf(fp, "%i\n%s\n%s\n%d.%d.%d\n\n" , &Person[i].identNr , &Person[i].fNam , &Person[i].vNam , &Person[i].gebDat.gdTag , &Person[i].gebDat.gdMonat , &Person[i].gebDat.gdJahr ); i++; }
klappt aber nicht
und wie ich das mit fgets zeilenweise machen könnte ist mir auch nicht so ganz klar...wäre nett wenn mir jmd helfen könnte!
-
Und was genau klappt nicht?
Das geht bei deinem 'Layout' genauso, die Zeilenumbrüche werden als whitespaces erkannt und übersprungen. Die Adressoperatoren vor den char Array Variablen sind überflüssig, eine Arrayvariable ist bereits stellvertredend für ihre Adresse.
Wenn du fgets nimmst, musst du die Zahlen konvertieren, wenn du sie in deiner Struktur speichern willst.
-
Prog stürzte immer ab, aber habs jetzt irgendwie hinbekommen mit fgets.
weiß selbst nicht worans lag, mit trial&error-verfahren hats aber zum glück nach stunden noch geklappt... naja, trotzdem danke für die hilfe!
-
/*****************************************************************************/ /* ReadPerFromFile(): Datensaetze aus einer Textdatei lesen */ /*****************************************************************************/ /* Rueckgabewert: Zeiger auf dyn. Strukturarray */ /* Eingang : Zeiger auf Dateiname (pFileName) */ /* Ausgang : Personendaten in dyn. Strukturarray abgespeichert */ /*****************************************************************************/ pperson_t ReadPerFromFile( const char *pFileName ) { person_t PerArr[PERANZMAX+1]; /* Hilfsfeld fuer Personen */ pperson_t pPerArr; /* Rückgabewert */ int PerAnz, /* Personenanzahl */ iAktP; /* Laufvariable fuer Hilfsfeld */ FILE *fp; /* Dateizeiger festlegen */ char nz[2]; /* Hilfsstring fuer Zeilenwechsel */ fp = fopen( pFileName, "r" ); /* Datei zum lesen oeffnen */ fscanf( fp, "%d", &PerAnz ); /* PerAnz lesen */ for( iAktP = 0; iAktP < PerAnz; iAktP++ ) /* PerAnz Datensaetze lesen */ { /* identNr lesen und Lesezeiger zur naechsten Zeile */ fscanf( fp, "%d", &PerArr[iAktP].identNr ); fgets( nz, 2, fp ); /* Familienname leseDn und '\n' aus Namen entfernen */ fgets( PerArr[iAktP].fNam, NAMLEN, fp ); PerArr[iAktP].fNam[strlen( PerArr[iAktP].fNam )-1] = '\0'; /* Vorname lesen und '\n' aus Namen entfernen */ fgets( PerArr[iAktP].vNam, NAMLEN, fp ); PerArr[iAktP].vNam[strlen( PerArr[iAktP].vNam )-1] = '\0'; /* Geburtsdaten lesen */ fscanf( fp, "%d", &PerArr[iAktP].gebDat.gdTag ); fscanf( fp, "%d", &PerArr[iAktP].gebDat.gdMonat ); fscanf( fp, "%d", &PerArr[iAktP].gebDat.gdJahr ); } fclose( fp ); /* Datenstrom schlieszen */ PerArr[iAktP].fNam[0] = EMPTYTAG_C; /* EndDatensatz markieren($) */ /* Dyn. Strukturarray erstellen und wenn moeglich, Daten reinkopieren */ if( NULL == ( pPerArr = (pperson_t)calloc( iAktP+1, sizeof(person_t) ))) { printf("\n\a Kein Arbeitsspeicher!"); pPerArr = NULL; } else { memcpy( pPerArr, PerArr, (iAktP+1) * sizeof(*pPerArr) ); } return pPerArr; } /* ReadPerFromFile() */
Wenn's nicht schon zu spät is
Gruß
Johann
-
Bei einer vorgegenen ASCCI-Datei (*.txt) sollte man besser die Funktion getline() verwenden!
-
berniebutt schrieb:
Bei einer vorgegenen ASCCI-Datei (*.txt) sollte man besser die Funktion getline() verwenden!
fgets!
-
Johann2 schrieb:
/*****************************************************************************/ /* ReadPerFromFile(): Datensaetze aus einer Textdatei lesen */ /*****************************************************************************/ /* Rueckgabewert: Zeiger auf dyn. Strukturarray */ /* Eingang : Zeiger auf Dateiname (pFileName) */ /* Ausgang : Personendaten in dyn. Strukturarray abgespeichert */ /*****************************************************************************/ pperson_t ReadPerFromFile( const char *pFileName ) { person_t PerArr[PERANZMAX+1]; /* Hilfsfeld fuer Personen */ pperson_t pPerArr; /* Rückgabewert */ int PerAnz, /* Personenanzahl */ iAktP; /* Laufvariable fuer Hilfsfeld */ FILE *fp; /* Dateizeiger festlegen */ char nz[2]; /* Hilfsstring fuer Zeilenwechsel */ fp = fopen( pFileName, "r" ); /* Datei zum lesen oeffnen */ fscanf( fp, "%d", &PerAnz ); /* PerAnz lesen */ for( iAktP = 0; iAktP < PerAnz; iAktP++ ) /* PerAnz Datensaetze lesen */ { /* identNr lesen und Lesezeiger zur naechsten Zeile */ fscanf( fp, "%d", &PerArr[iAktP].identNr ); fgets( nz, 2, fp ); /* Familienname leseDn und '\n' aus Namen entfernen */ fgets( PerArr[iAktP].fNam, NAMLEN, fp ); PerArr[iAktP].fNam[strlen( PerArr[iAktP].fNam )-1] = '\0'; /* Vorname lesen und '\n' aus Namen entfernen */ fgets( PerArr[iAktP].vNam, NAMLEN, fp ); PerArr[iAktP].vNam[strlen( PerArr[iAktP].vNam )-1] = '\0'; /* Geburtsdaten lesen */ fscanf( fp, "%d", &PerArr[iAktP].gebDat.gdTag ); fscanf( fp, "%d", &PerArr[iAktP].gebDat.gdMonat ); fscanf( fp, "%d", &PerArr[iAktP].gebDat.gdJahr ); } fclose( fp ); /* Datenstrom schlieszen */ PerArr[iAktP].fNam[0] = EMPTYTAG_C; /* EndDatensatz markieren($) */ /* Dyn. Strukturarray erstellen und wenn moeglich, Daten reinkopieren */ if( NULL == ( pPerArr = (pperson_t)calloc( iAktP+1, sizeof(person_t) ))) { printf("\n\a Kein Arbeitsspeicher!"); pPerArr = NULL; } else { memcpy( pPerArr, PerArr, (iAktP+1) * sizeof(*pPerArr) ); } return pPerArr; } /* ReadPerFromFile() */
Wenn's nicht schon zu spät is
Gruß
Johanngenau so hab ichs jetzt auch gemacht ^^ wir sind nicht zufällig im selben studiengang, oder? sieht mir doch sehr nach ebels aufgabe aus
-
wir sind nicht zufällig im selben studiengang, oder? sieht mir doch sehr nach ebels aufgabe aus
Jops sind wir. Mein Prog wurde auch schon heute morgen von Hamel geprüft.
Darum auch das:
Wenn's nicht schon zu spät is
xD man hat ich Glück das ich Hamel noch rechtzeitig angetroffen hatte. Bin morgens um 10.00 Uhr hin, hatte es nicht mitgekriegt das mein Abgabetermin auf 8 Uhr vorgestetzt wurde und der hat dann doch noch "nen Auge zu gedrückt"
Gruß
Johann
-
Hi
Ich bin auch beim Ebel und muss morgen abgeben und komme garnicht klar könnte mir einer von euch "Aushelfen"??
LG
-
Calyx12432132 schrieb:
/*****************************************************************************/ /* ReadPerFromFile(): Datensaetze aus einer Textdatei lesen */ /*****************************************************************************/ /* Rueckgabewert: Zeiger auf dyn. Strukturarray */ /* Eingang : Zeiger auf Dateiname (pFileName) */ /* Ausgang : Personendaten in dyn. Strukturarray abgespeichert */ /*****************************************************************************/ pperson_t ReadPerFromFile( const char *pFileName ) { person_t PerArr[PERANZMAX+1]; /* Hilfsfeld fuer Personen */ pperson_t pPerArr; /* Rückgabewert */ return pPerArr; } /* ReadPerFromFile() */
Wie stellst du im aufrufenden Kontext die Anzahl der gelieferten Werte fest?
Wo prüfst du den Rückgabewert der Dateilesefunktionen, d.h. wie reagiert dein Programm, wenn nicht genau deine Struktur mit genau der Anzahl Elemente vorliegt? Richtig! Undefiniertes Verhalten, Note 6, setzen.