Code:
#include <stdlib.h>
#include <stdio.h>
#include <pwd.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
char buf[100];
FILE *pass;
struct passwd *pass_1;
pass = fopen(argv[1], "r");
if (pass != NULL) {
for ( pass_1 = fgetpwent(pass) ;
pass_1 != NULL ;
pass_1 = fgetpwent(pass) ) {
printf("%s\n",pass_1->pw_name);
}
fclose(pass);
} else
perror(argv[0]);
}
Merke:
Du solltest _jeden_ Ruckgabewert einer Systemfunktion auf Fehler ueberpruefen.
Ausserdem solltest Du den Wert selber testen (pass_1) und nicht irgenwelche Vermutungen uber irgenwelche Zusammenhange (!feof(pass))
(!feof(pass)) Zeigt nach dem letzten user naemlich noch kein Dateiende an, da fgetwent ja nur bis einschliesslich des "\n" der jeweiligen Zeile liest und erst beim naechtsen Aufruf an das Dateiende stoesst und
NULL zurueckliefert.
Dereferenzierst Du nun den NULL-Pointer gibst halt nen Segfault.
man fgetpwent
beschreibt ja auch dieses Verhalten.
if (pass != NULL) sollte auch _nie_ fehlen nach dem Versuch pass mit fopen zu oeffnen.
Lesezeichen