Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    24

    [C] Leggere uno specifico dato da un file

    Buona pasquetta a tutti

    poco fa mi sono imbattuto nel seguente dilemma, e non trovando tantissime risposte volevo chiedervi qualche consiglio. vi spiego il problema:

    creo un nuovo file in modalità write con inserimenti " numerati "
    per intenderci, il file riceve in ingresso i dati in questa maniera :

    codice:
    printf("\nCompila i seguenti campi\n");    do{
            printf("\nInserimento numero %d\n" ,i);    
            printf("Nome:\n");
            scanf("%s" ,&l.nome);
            printf("Cognome:\n");
            scanf("%s" ,&l.cognome);
            printf("Codice:\n");
            scanf("%d" ,&l.codice);
            fprintf(pf, "%d\n%s %s\n%d\n\n" , i, l.nome, l.cognome, l.codice);
            printf("Inserire -1 per terminare, qualunque altro numero intero per continuare\n");
            scanf("%d" ,&spia);
            if(spia > -1)
                i++
        }while(spia != -1);
        cls=fclose(pf);
        if(cls != 0)
            printf("\nErrore nella chiusura del file\n");
    Ora il file dovrebbe essere scritto in questa maniera ( per facilità di lettura utilizzerò la tag del code

    codice:
    1
    Alessio bombolone
    234321
    
    2
    Angelo Fonfofofo
    3432324 
    
    e così via...
    la mia domanda è la seguente:

    se io volessi leggere solo il numero dell'inserimento, ossia il numero che si trova sopra ogni nome (1 , 2 nell'esempio), in modo da utilizzarlo come indice-grandezza massima di un array. come potrei fare?

    io avevo cominciato a pensare ad un piccolo algoritmo in via teorica, senza codice, ma su alcuni passi sono ancora dubbioso.

    questo è stato il mio ragionamento :

    devo ricercare il %d maggiore, anche se ricevo 2 %d diversi ( il numero più lungo, sotto il nome della persona) posso usare l'operatore modulo per distinguere su quale andrò a lavorare in quanto il codice della persona è sempre un numero pari, il numero d'inserimento è sempre dispari.
    in particolare qui è sorto il primo dubbio: leggendo il file riga per riga, sarei obbligato a leggere anche i %s. o c'è un modo anche per scandire la lettura delle righe, leggendo solo i dati che a me interessano di più?

    premesso è un esercizio, devo utilizzare il file e stavo pensando di indicizzare un array per poi favorire la cancellazione e la gestione degli elementi per indice.
    Non è possibile utilizzare liste ( non è una mia scelta, non sono contemplate nella consegna )

    Nel caso non fossi stato chiaro \o non poco pretenzioso np e grazie lo stesso

    ---------------Aggiornamento ------------------

    Piccolo(credo) passetto avanti( forse sbagliato)

    per ricavarmi l'indice e avere i successivi inserimenti in modalità append di modifica del file utilizzo, per ora il seguente codice )

    codice:
    int grandezza_array(char nomefile[]){
        FILE *pf;
        int i=0;
        Persona l={"","", 123456};
    
    
    
    
        pf=fopen(nomefile, "r");
        if(pf == NULL)
            printf("\n Errore nell'apertura del file\n");
    
    
        while(!feof(pf) )
        {
            fscanf(pf,"%d\n%s %s\n%d\n\n", &i, &l.nome, &l.cognome, &l.codice);
        }
    
    
        ind=i;
        printf("%d" ,ind);
    
        return i;
    }
    questa funzione ritorna i, e salva in ind ( una variabile che ho messo come globale ) il numero dell'ultimo inserimento, il resto dei dati ( nome, cognome etc, tranne la I ) dovrebbero perdersi alla fine della funzione

    fine aggiornamento
    Ultima modifica di legeo88; 21-04-2014 a 16:04

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao,
    se ho capito bene vuoi trovare il massimo indice (numero sopra al nome) contenuto nel file, giusto?
    Se è così l'algoritmo non mi sembra complesso e può essere più o meno questo:
    - leggi una riga. E' un indice ed è il primo che leggi: lo salvi nella viariabile max
    - leggi tre righe (magari dentro a un for) e le trascuri: saranno il nome, il codice e la riga vuota
    - c'è qualcos'altro nel file? Se il file è terminato allora max contiene il massimo. Altrimenti
    - leggi una riga: è un indice. Se è maggiore di max lo metti in max (sostituzione), altrimenti no
    - leggi tre righe e le trascuri
    - c'è qualcos'altro nel file? Se il file è terminato allora max contiene il massimo. Altrimenti ripeti


  3. #3
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    550

    ciao

    Il file è strutturato in modo , che una serie di dati si ripetano sequenzialmente .

    ora non è detto che leggendo un file , tu debba leggere una singola riga per volta , ma puoi leggere più
    righe alla volta , ripetendo una funzione più volte e avanzando di conseguenza di tot righe alla volta .

    Mi viene difficile spiegarlo a parole quindi ti posto un esempio .

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main(int argc, char *argv[])
    {
      FILE *f;
      int n=0;
      
      f=fopen("file.txt","r");
      while(!feof(f))
      {
          fscanf(f,"%d\n",&n); //legge il numero indice
          fscanf(f,"%*s %*s\n"); //legge nome e cognome e newline 
          fscanf(f,"%*s\n"); //legge numero  e newline 
          
          printf("%d\n",n); 
      }    
      fclose(f);
      system("PAUSE");    
      return 0;
    }

    ESEMPIO FILE

    *******************
    1
    Alessio bombolone
    234321


    2
    Angelo Fonfofofo
    3432324


    3
    PIERO ROSSO
    344556
    Ultima modifica di torn24; 21-04-2014 a 16:00
    Tecnologia

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    24
    Ragazzi, ora mi leggo per bene le vostre risposte e me le studio

    grazie mille, non mi aspettavo tanta celerità !
    appena il programma è completo lo posto, grazie ancora

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 © 2020 vBulletin Solutions, Inc. All rights reserved.