strtok
-
hallo erst mal. ich habe ein problem mit strings und dateiverarbeitung. wenn ihr euch die funktion bitte mal anschaun könnt.
vielen dank!
sealps: keine sorge, weil nur eine pupil_t definiert ist. sie soll, wenn die funktion soweit funktioniert, sofort in eine andere datei geschrieben werden
typedef struct { char name[50]; char firstname[50]; char sex; int catalogNumber; char clas[10]; char status; } pupil_t; int RandAccFile(FILE *source, FILE *binary) { char error[201]; char s[1001] = {'\0'}; char *r = {'\0'}; pupil_t p; int zae= 0; //erste zeile lesen fgets(s, sizeof(pupil_t), source); puts(s); //zeile in die struktur abspeichern und naechste zeile lesen while(s) { r = strtok(s, ";"); strcpy(p.name, r); r = strtok(NULL, ";"); strcpy(p.firstname, r); r = strtok(NULL, ";"); sscanf(r, "%c", &p.sex); r = strtok(NULL, ";"); sscanf(r, "%d", &p.catalogNumber); r = strtok(NULL, ";"); strcpy(p.clas, r); r = strtok(NULL, r); sscanf(r, "%c", &p.status); //gespeicherte strukur ausgeben printf("%s\t%s\t%c\t%d\t%s\t%c", p.name, p.firstname, p.sex, p.catalogNumber, p.clas, p.status); //naechste zeile lesen fgets(s, sizeof(pupil_t), source); } return zae; }
-
Hierzu habe ich zwei Fragen:
- Was ist Dein Problem?
- Ist es Absicht, daß Du beim letztem Aufruf von strtok als zweiten Parameter r statt ";" übergibst?mfg Martin
-
mgaeckler schrieb:
- Was ist Dein Problem?
mein problem ist, das ich mit segmentation fault fliege. und zwar in der 22. zeile.
mgaeckler schrieb:
- Ist es Absicht, daß Du beim letztem Aufruf von strtok als zweiten Parameter r statt ";" übergibst?
danke, das eine r statt ";" war ein fehler. ändert nix an meinem problem
-
Du wertest den Rückgabewert von strtok nicht aus, dieser kann auch NULL sein.
strcpy(p.name,NULL)
könnte z.B. eine Ursache sein. Rückgabewerte sind dazu da, verwendet zu werden. Eine Längenprüfung auf ausreichend Platz im strcpy-Ziel machst du auch nicht.
fgets(s, sizeof(pupil_t), source);
sollte wohl ( für s als array ) heißen:
fgets(s, sizeof s, source);
Ich glaube, du wärst mit sscanf statt strtok besser bedient, da strtok auch einige Erfahrung verlangt; z.B. ohne Längenprüfung wäre möglich:
while( fgets( s,1001,source ) ) if( 6==sscanf(s,"%[^;]%*[ ;]%[^;]%*[ ;]%c%*[ ;]%d%*[ ;]%[^;]%*[ ;]%c",p.name,p.firstname,&p.sex,&p.catalogNumber,p.clas,&p.status) ) printf("%s\t%s\t%c\t%d\t%s\t%c", p.name, p.firstname, p.sex, p.catalogNumber, p.clas, p.status);
-
Außerdem hast du eine Endlosschleife mit
while(s)
s ist immer != NULL da es ein Array ist.
Evtl meinst du da ja
while(*s)
solange s zumindest ein Zeichen enthält.
-
vielen dank, euch beiden!
meine fehler waren, der eine falsche strtok-aufruf, das while(s) und noch viel schlimmer: der filepointer source war nicht mit einer datei belegt, da ich in der funktion zuvor einen fehler hatte, der zuerst nicht auffiehl.vielen dank speziell bezüglich des kryptischen sscanf aufrufs. wird meinem professor sicherlich gefallen
mfg seal