Hilfe bei C Programm1
-
Es solle aus einer bestimmten Textdatei mit folgenden Elementen :
Nachname Semester Geburtdatum
Eine bestimmte Spalte z.B Geburtdatum ausgelesen werden.
Elemente wurden in einer Struktur angelegt.
Kommte leider nicht mehr weiter
[code]
#include <stdio.h>
#include <stdlib.h>
#include <string.h.>int main ()
{
typedef struct{
int tag;
int monat;
int jahr;
}datum;typedef struct
{
char name[10];
int semester;
datum geburtstag;}student;
int x=0;
int c;
FILE *datei;
int i=0;
student studi[10];
int u;
char buffer[500];
char *token;datei=fopen("stud.txt","r");
if(datei != NULL) {
while( (buffer[i]=fgetc(datei)) != ';')
putchar(buffer[i]);}
while(u!=10)
{
if(x==0)
{token=strtok(buffer,"|");
}
else{token=strtok(NULL,"|");
x++;strcpy(studi[u].name,token);
studi[u].semester=atoi(strtok(NULL,"|"));
studi[u].geburtstag.tag=atoi(strtok(NULL,"."));
studi[u].geburtstag.monat=atoi(strtok(NULL,"."));
studi[u].geburtstag.jahr=atoi(strtok(NULL,"|"));
u++;}
-
Was ist deine Frage?
-
ja wie gebe ich z.b jetzt nur die Spalte Geburtstag aus bzw aus einem Text in eine Struktur. Die ich dann weiterverarbeiten kann!
-
Denk in Teilproblemen. Schreib dir eine Funktion, die einen Dateizeiger und ein
struct datum*
nimmt und aus der Datei ein datum liest (und zurück gibt, ob alles gut ging). Dann eine Funktion die einen Dateizeiger und ein struct student* nimmt und einen Studentendatensatz liest und zurück gibt, ob alles gut ging. Dabei bietet es sich an, die Datumslesefunktion zu benutzen. Orientier dich da dran, wie hier die Lese-Funktionen mit 'f' am Anfang gemacht sind:
http://www.cplusplus.com/reference/clibrary/cstdio/Höchstwahrscheinlich wirst du auch die eine oder andere dieser Funktionen benutzen wollen, naheliegend sind fgets und fscanf. Und dann benutzt du solange diese Funktion wie du lustig bist oder bis sie einen Lesefehler signalisiert.
P.S.:
char name[10];
Was habe ich das früher gehasst bei Spielen, wo der Name nur 8 Zeichen haben konnte. Endlich, durch den Fortschritt und deine Programmierkünste, kann ich meinen vollständigen Vornamen angeben!
-
u ist nicht initialisiert.
Das meckert auch der Compiler an.
i wird nicht weitergezählt
buffer wird nicht mit '\0' terminiert. Das ist nötig fürstrtok()
x wird nicht mehr auf 0 gesetzt.Du liest nur eine Zeile in buffer ein, willst aber 10 Datensätze auswerten.
Die
typedef
sind besser außerhalb dermain()
aufgehoben.In C schreibt man statt
while(u!=10)
besserwhile(u<10)
PS. Du hast das schließende [\code] vergessen.
Nimm aber lieber das cpp Tag (der C/C++ Button unter den). Dann wird es schön bunt.
@SeppJ
Dein Name hat doch nur 5 Buchstaben. Oder meinst du deinen Nachnamen: Moderator
-
#include <stdio.h> #include <stdlib.h> #include <string.h.> int main () { typedef struct{ int tag; int monat; int jahr; }datum; typedef struct { char name[10]; int semester; datum geburtstag; }student; FILE *datei; int i=0; student studi[10]; datei=fopen("stud.txt","r"); while( i<10 && 5==fscanf(datei,"%9[^|]|%d%*s%d.%d.%d%*s",studi[i].name,&studi[i].semester,&studi[i].geburtstag.tag,&studi[i].geburtstag.monat,&studi[i].geburtstag.jahr) ) ++i; fclose(datei); while( i-- ) printf("%s %d %d.%d.%d\n",studi[i].name,studi[i].semester,studi[i].geburtstag.tag,studi[i].geburtstag.monat,studi[i].geburtstag.jahr); return 0; }
sollte für Dateien der Form
`Name1 | 4 | 1.1.2011 |
Namexyz | 5 | 2.2.2012 |`
usw. ausreichen. strtok brauchst du nicht zu bemühen.
Schaue dir Zeile 30 an und lerne.
-
Hi Wutz, liegen die Daten nicht zeilenweise vor ?
-
Es ist ein stream.