Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6

    [C] Lettura e 'parsing' di file di testo

    Ciao a tutti!
    Ho un problema di questo tipo e non ho ancora trovato una soluzione intelligente per risolverlo.
    Sto creando un programma C che agisce su un file di testo strutturato in questo modo:

    Codice PHP:
    REPORT


      Data iniziale
    Anno 2009Mese 06Giorno 04Ore 00:00:00
      Data finale
    Anno 2009Mese 06Giorno 04Ore 24:00:00

    Nome elemento
    ABConsumo (l): 0.144665
    Nome elemento
    CDConsumo (l): 0.083810
    Nome elemento
    EFConsumo (l): 0.027732
    Nome elemento
    GHConsumo (l): 0.066554
    Nome elemento
    ILConsumo (l): 0.000462
    Nome elemento
    MNConsumo (l): 0.025884

    Data e ora di creazione rapporto
    06/05/09 15:44:12 
    Il numero di elementi varia da 1 a 16, il loro nome è sempre composto da due lettere, mentre il consumo è sempre un numero a 6 decimali.

    Quello che mi interessa fare è memorizzare tramite array i nomi degli elementi (AB,CD,EF,GH,IL,MN...) e i relativi consumi, per poi elaborarli tramite un programma che ho già preparato.

    Putroppo con la lettura da file mi incasino sempre e dopo aver sclerato da fgets e sscanf non sono riuscito a trovare una soluzione soddisfacente...

    Qualche consiglio?

    Grazie in anticipo!

  2. #2
    Salta le prime sei righe e gestisci il resto con la fscanf.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    Ok ma dovrei usare delle fseek ad hoc per spostarmi nei punti desiderati giusto?
    Speravo esistesse una soluzione più "elegante" ma se è l'unica penso che mi adatterò.

    Grazie della risposta intanto

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da Gabro27
    Ok ma dovrei usare delle fseek ad hoc per spostarmi nei punti desiderati giusto?
    Per saltare le prime righe, semplicemente leggile e scartale.

    Speravo esistesse una soluzione più "elegante" ma se è l'unica penso che mi adatterò.
    E' abbastanza elegante ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    Intanto grazie delle risposte

    Ho abbozzato un codice del genere:

    Codice PHP:
    char nome[16][3];
    double quant[16];
    char buf[200];

    /.../

    for(
    i=0;buf!=NULL;i++)
        {
            
    //Leggo la riga inserendola in un buffer
            
    fgets(buf,sizeof(buf),fp);
            
            
    //Estraggo i dati dal buffer
            
    sscanf(buf,"Nome elemento: %2s, Consumo (l): %f ",&nome[i],&quant[i]);
            
            
    //Debug
            
    printf("%s %f",nome[i],quant[i]);
        } 
    Sinceramente non so se l'uso della sscanf è corretto, perché compilandolo così mi legge correttamente i nomi ma i consumi risultano sempre 0.000000

    Probabilmente sbaglio nella lettura del double... ipotesi?

    Grazie e ciao!

  6. #6
    È sbagliata la stringa di formato per il double (deve essere %lf). Per il resto, puoi fare a meno del buffer:
    codice:
    char nome[16][3];
    double quant[16];
    
    /* Salta le prime sei righe */
    for(i=0;i<6 && !feof(fp);i++)
        fscanf(fp,"%*s");
    
    /* Estrae i dati dal file */
    for(i=0;i<16 && !feof(fp);i++)
    {
        if(fscanf(fp, "Nome elemento: %2s, Consumo (l): %lf ",&nome[i],&quant[i])<2)
            break;
    }
    /* In i ora hai il numero di elementi letti */
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    Grazie della risposta. Correggento %f con %lf funziona come speravo

    Comunque il file che ho postato all'inizio è un prototipo. Le righe non sono sempre 6 ma ho risolto in questo modo:

    Codice PHP:
    do
        {
            
    fgets(buffer,sizeof(buffer),fp);
        }
        while(
    strcmp(buffer,"Nome")); 
    Ora faccio ulteriori prove! Intanto grazie per l'aiuto!

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    Grazie a tutti! Con i vostri consigli ho sistemato tutto e adesso funziona alla perfezione.

    Ho un altro quesito da porvi, approfittando della vostra disponibilità.

    Con lo stesso programma, per visualizzare i dati elaborati, genero una tabella html e fino a qui tutto bene.

    Il problema sorge quando provo a inserire delle immagini nella tabella.


    Codice PHP:
    //Ometto il resto del codice. Siamo comunque all'interno di un ciclo che incrementa l'indice i
    fprintf(fp,"<td><img search=\"directory/%s.png\"</td>",nomeImmagine[i]); 
    La tabella generata nel sorgente mostra:
    <img search="directory/1.png">
    <img search="directory/2.png">

    e così via, quindi il codice risulta corretto.

    Il problema è che non mi visualizza l'immagine!
    Ho provato con diversi browser, anche aggiungendo uno slash "/" prima della directory, ma niente cambia.

    La cosa strana è che se copio manualmente il percorso dell'immagine nella barra indirizzi questa si vede eccome!

    Suggerimenti?

    Grazie! Ciao

  9. #9
    Originariamente inviato da Gabro27

    Suggerimenti?
    prova con:
    Codice PHP:
    fprintf(fp,"<td><img [b][color=green]src[/color][/b]=\"directory/%s.png\"[b][color=green]>[/color][/b]</td>",nomeImmagine[i]); 
    ;-)

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    6
    Mioddio che idiota che sono...

    Grazie mille

    Ciao!

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.