Risultati da 1 a 3 di 3

Discussione: [c]fscanf file

  1. #1
    New Member
    Data Registrazione
    06-05-2010
    Messaggi
    1

    [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

  2. #2
    Software Zone Fanatic L'avatar di © Rocky
    Data Registrazione
    15-12-2005
    Località
    L'astronave è momentaneamente in riparazione.
    Messaggi
    6.752
    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

  3. #3
    New Member
    Data Registrazione
    15-03-2010
    Messaggi
    6
    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

Segnalibri

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
  •