Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500

    [C] File ad accesso casuale

    ciao..ho un problema sulla lettura di un file. Il problema è che ho un file .txt e devo fare una ricerca nel file...ma il fatto è che nn devo salvare il contenuto del file in memoria....ma devo effettuare una ricerca direttamente sul file...leggendo sul mio manuale deitel ho visto che nel capitolo dove spiega i file ad accesso casuale parla di fseek(), fwrite() e fread()...il fatto è che nn ho capito bene come funzionano...
    spero che qualcuno può spiegarmi meglio...
    grazie
    Mrx87

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sono pagine di spiegazioni ... cosa non hai capito in particolare?

    Hai scritto del codice che non funziona come pensi?

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    leggendo nel deitel...ho visto un esempio e ho provato a riportarlo in C x vedere se riuscivo a capire gli effetti della fseek e della fwrite...ma...il file che la fwrite mi va a scrivere ha dei caratteri che nn dovrebbero esserci...
    posto qua sotto il codice prova...sperando d nn aver scritto cose sbagliate...
    codice:
    #include <stdio.h>
    
    struct data {
           int conto;
           char nome[10];
           char cogn[15];
    };
    
    int main ()
    { 
        struct data str = {0,"",""};
        
        printf ("Inserire codice: ");
        scanf  ("%d", &str.conto);
        
        FILE *aptr;
        
        aptr = fopen ("File_causale.txt", "a+");
        
        while ( str.conto != 0 ) {
              printf ("Inserire nome e cognome: ");
              scanf  ("%s%s", str.nome, str.cogn);
              
              fseek ( aptr,(str.conto-1)*sizeof( struct data), SEEK_SET);
              
              fwrite (&str,sizeof(struct data),1,aptr);
              
              printf ("Inserire un numero conto: ");
              scanf  ("%d", &str.conto);
              fprintf (aptr,"\n");
        }
        fclose(aptr);
        
        system ("pause");
    }
    cn input:
    numero codice: 1
    nome e cognome: mario rossi
    numero codice: 2
    nome e cognome: antonio verdi
    numero codice: 3
    nome e cognome: giuseppe bianco
    numero codice: 0
    termina.
    .....il file che mi va a creare chiamato File_casuale.txt ha seguente contenuto:
     mario rossi ˙"
     antonio verdi ˙"
     giuseppe bianco ˙"
    é normale che abbia anche quei caratteri strani??

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sì ... e' corretto ...

    Quei caratteri non sono altro che la rappresentazione ASCII dei 4 byte che costituiscono il valore intero presente nella struttura (campo conto).

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ah okay...ma a questo punto...mi chiedevo...se il file rimanese scritto così, e in seguito riapro il file e vedo a leggere quello che c'è scritto cn una fscanf("%s%s", str.nome, str.cogn), non leggerà cm dovrebbe??

  6. #6
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    pardon...prima nella fscanf ho scordato di mettere il puntatore al file...
    fscanf (aptr,"%s%s", str.nome, str.cogn);

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No ... non devi usare la fscanf ...

    Se usi la fwrite per scrivere, e' bene usare la fread per leggere ... e otterrai le informazioni corrette ...

  8. #8
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ah okay...e dovendo fare la ricerca per nome nel file che mi è stato creato...prendiamo cm esempio quello d prima...cm posso fare ad effettuare una ricerca sul file? per esempio trovare il cliente antonio verdi??

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Se hai scritto i singoli record senza nessun ordine, ovviamente li dovrai leggere uno per uno, sequenzialmente.

    Se li hai scritti in maniera ordinata (secondo il cognome) allora puoi effettuare una "ricerca binaria" ...

  10. #10
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ho provato a fare un programmino che utilizzi queste funzioni...e che deve ricercare un record nel file e stamparlo se viene trovato...ma non funziona...
    ...provo a postare il codice...se potete correggere quello che ho sbalgiato...
    codice:
    #include <stdio.h>
    
    struct data {
           int conto;
           char nome[10];
           char cogn[15];
           int saldo;
    };
    
    int main ()
    { 
        struct data str = {0,"","",0};
        char pstr[10];
        int ncont,i;
        FILE *aptr;
        
        aptr = fopen("File_casuale.txt","rb+");
        
        printf ("Inserire numeri di conto: ");
        scanf  ("%d", &str.conto);
        rewind(aptr);
        while ( str.conto != 0 ) {
              printf ("Inserire nome e cognome: ");
              scanf  ("%s%s", str.nome, str.cogn);
              printf ("Inserire saldo utente: ");
              scanf  ("%d", &str.saldo);
              
              fwrite (&str,sizeof(struct data),1,aptr);
        
              printf ("\nInserire un numero conto: ");
              scanf  ("%d", &str.conto);
        }
        
        //ricerca per numero di conto
        printf ("Inserire numero conto per la ricerca: ");
        scanf  ("%d", &ncont);
        
        fseek(aptr,(ncont-1)*sizeof(struct data),SEEK_SET);
        
        fread(&str,sizeof(struct data),1,aptr);
        
        if ( str.conto == ncont ) {
             printf ("Conto trovato\n");
             printf ("%d%s%s%d\n", str.conto, str.nome, str.cogn, str.saldo);
        }
        else {
             printf ("Non e' stato trovato il conto corrispondente\n");
        }
        fclose(aptr);
        system ("pause");
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.