-
[c]fscanf file
mi è stato assegnato un esercizio all università
devo leggere il file /etc/passwd Si tratta di un file di testo, in cui ogni riga contiene le informazioni di un utente, e i campi all'interno di una riga sono separati da ':'. Per esempio, la riga
operator:x:37:12:Operator:/var:/bin/sh
ha il seguente significato:
* operator è il nome di login dell'utente;
* x rappresenta il campo password (sui sistemi del Centro di Calcolo sono in uso le shadow password, per cui la password non è visibile; in altri casi questo campo contiene la password dell'utente, in forma crittografata tramite la funzione crypt());
* 37 è l'ID numerico dell'utente;
* 12 è l'ID numerico del gruppo a cui appartiene l'utente (a volte i due valori coincidono);
* Operator è il nome in chiaro dell'utente;
* /var è l'home directory dell'utente;
* /bin/sh è la shell di login (e di default) dell'utente.
quindi è diviso in 7 campi ogni riga separata dal :
IL MIO PROGRAMMA PER OGNI RIGA DEL FILE PASSWD DEVE STAMPARE IL 5 E IL 7 PARAMETRO
ecco il mio programma
#include <stdlib.h>
#include <malloc.h>
#include <ctype.h>
#include<string.h>
#include<stdio.h>
int main(){
FILE *stream;
int result;
char t[20];
char u[20];
stream=fopen("/etc/passwd","r");
if ((stream = fopen("/etc/passwd", "r")) == NULL)
{
printf("Non posso aprire il file %s", "fo");
exit(1);
}
result = fscanf(stream,"%*[^':']:%*[^':']:%*[^':']:%*[^':']:%[^':']:%*[^':']:%s",t,u);
while(!feof(stream)) {
printf("%s %s",t,u);
result = fscanf(stream,"%*[^':']:%*[^':']:%*[^':']:%*[^':']:%[^':']:%*[^':']:%s",t,u);
fclose(stream);
}
}
MI STAMPA VALORI A LOOP...se levo il ciclo while e stampo per esempio solo il 5 e il 7 campo della 1 riga il programma me la stampa correttamente,quindi l errore è che non mi riconosce la fine file il programma
-
Software Zone Fanatic
Ciao Esoni,
non sono pratico di C comunque credo tu debba usare l' EOF (End Of File) per dire alla macchina quando finire, in altre parole ... quando il ciclo legge EOF significa che non c'è altro da stampare.
Non vorrei dire una stupidaggine ma, potresti definire tu un carattere particolare che quando viene letto significa "termina", tipo CTRL+ Z o altro.
Invece del For puoi usare While, purtroppo non so dirti altro
#include <stdio.h> //in stdio.h EOF è di default -1
main()
{
double nc;
for (nc = 0; getchar() != EOF; ++nc)
;
printf("%.0f\n", nc);
getchar();
}
Mi sento un'illusione in un mondo immaginario
-
Ciao!
Ho letto il codice, e ho trovato alcune imperfezioni all' apertura del file.
Dovresti scrivere:
...
stream=fopen("/etc/passwd","r");
if (stream == NULL)
...
oppure
...
FILE *stream;
if ((stream = fopen("/etc/passwd", "r")) == NULL)
{
printf("Non posso aprire il file %s", "fo");
return 0;
}
...
Per la lettura , è possibile impostare un ciclo che legge il file, carattere per carattere, in questo modo:
...
char ch=' ';
while ((ch=getc(stream) != EOF)
{
<blocco istruzioni>
}
...
Qindi, contando i caratteri divisori ( : ) sarà possibile determinare cosa stampare.
Ultima modifica di Poggim; 15-05-2010 alle 23.00.40
Permessi di Scrittura
- Tu non puoi inviare nuove discussioni
- Tu non puoi inviare risposte
- Tu non puoi inviare allegati
- Tu non puoi modificare i tuoi messaggi
-
Regole del Forum
Segnalibri