Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [c] validare formato dati in un file

    salve ragazzi.. come parte di un progetto per l'uni ho da aprire un file, controllarne il formato interno, e poi eseguire un'operazione per ogni sua riga...

    Il file dev'essere così formato:
    parola<cr>
    parola<cr>
    parola<cr>
    parola<cr>
    <eof>

    ovvero su ogni riga ci deve essere una parola (alfanumerica) e nient'altro... se c'è una riga vuota o se ci sono caratteri "intrusi" o altre anomalie, devo uscire dal programma stampando un errore... altrimenti devo andare ad elaborare le righe del file(e su questo non ho problemi)...


    come posso fare?

    tnx

  2. #2
    Utente di HTML.it L'avatar di pixer
    Registrato dal
    Oct 2000
    Messaggi
    614

    Re: [c] validare formato dati in un file

    Originariamente inviato da }gu|do[z]{®©
    come posso fare?

    tnx
    Usando fopen() e fgets().

    codice:
    char c[100];
      FILE *file = fopen("file.txt", "r"); 
    
      if(file==NULL) {
        printf("Errore apertura file.\n");
        return 1;
      }
      else {
        while(fgets(c, 100, file)!=NULL) { 
          printf("%s", c);        
        }
        fclose(file);
    MySQL Worker - The OpenSource Multiplatform MySQL database Administrator (C++ powered)
    .:[ It resumes the development !! ]:.


  3. #3
    il controllo se il fil esiste è un'altra condizione del progetto e l'ho fatto già... :zamm:

    non so se posso usare fgets.. temo di poter usare solo getc()... chiederò per sicurezza

    e poi non posso fare supposizioni sulla lunghezza delle parole...

    e cmq non capisco come il tuo codice mi dovrebbe segnalare ch eil file è formattato male... stampi le righe che leggi... io devo vedere che non ci siano righe vuote, e che per ogni riga ci sia un'unica stringa alfanumerica ininterrotta... insomma dev'essere per forza come illustrato ne post sopra.. se è così vado avanti, altrimenti devo dare errore e cessare l'esecuzione.

    pensavo a due while annidati.. il primo che cicla fino a end of file, il secondo che cicla su ogni riga e, leggendo carattere per carattere, alza un flag se c'è qualcosa che non va(un carattere che non sia lettera o numero... o nessun carattere prima di \n)... però non ho provato a scriverlo... se qualcuno pensa possa essere la strada giusta me lo dica.. idem in caso mi sfugga qualcosa in questo modo..


  4. #4
    Utente di HTML.it L'avatar di pixer
    Registrato dal
    Oct 2000
    Messaggi
    614
    Originariamente inviato da }gu|do[z]{®©
    e cmq non capisco come il tuo codice mi dovrebbe segnalare ch eil file è formattato male... stampi le righe che leggi...
    Io ti ho scritto come leggere il file riga per riga, sta a te implementare il controllo.
    MySQL Worker - The OpenSource Multiplatform MySQL database Administrator (C++ powered)
    .:[ It resumes the development !! ]:.


  5. #5
    Originariamente inviato da pixer
    Io ti ho scritto come leggere il file riga per riga, sta a te implementare il controllo.
    ma leggere il file riga per riga lo so fare mica sono deficiente... se ho postato è perchè ho dubbi sul controllo, no?

  6. #6
    controlla coi codici ascii

    fai un ciclo all'interno del while di pixer che vada da 1 fino alla lunghezza della stringa corrente

    in quel ciclo controlli ogni carattere, segnali errore quando incontri il codice ascii dello spazio o un altro che non sia compreso nel range delle lettere da A a Z... se invece le lettere sono nel range, e l'ultima corrisponde all'ascii 13 (cr) prosegui... o la parola deve essere anche di senso compiuto?

  7. #7
    dopo che leggi la riga...o mentre leggi la riga che è meglio controlli il range del carattere...devi controllare 3 range...

    dalla a alla z, dalla A alla Z e dallo 0 al 9
    ovviamente prendi i relativi codici ascii

    dopo che tiri fuori la riga...è già controllata...quindi puoi farci quello che ti pare ^^

  8. #8
    Originariamente inviato da Caleb
    controlla coi codici ascii

    fai un ciclo all'interno del while di pixer che vada da 1 fino alla lunghezza della stringa corrente

    in quel ciclo controlli ogni carattere, segnali errore quando incontri il codice ascii dello spazio o un altro che non sia compreso nel range delle lettere da A a Z... se invece le lettere sono nel range, e l'ultima corrisponde all'ascii 13 (cr) prosegui... o la parola deve essere anche di senso compiuto?
    no che di senso compiuto.. ci mancherebbe

    il file non è altro che una lista di nomi file [che però deve avere quel formato: nomi files alfanumerici, senza estensione ed esattamente uno per riga].
    In breve tutto il modulo che sto preparando devo verificare che esista il file di input e che il suo formato sia quello atteso, passati questi controlli devo aprire ognuno di quei file, leggervi tutte le parole valide [stringhe alfanumeriche] e scriverle minuscolizzate in un file di output (se uno dei file listati non esiste devo scrivere una riga che dice che il file non esiste)


    Ho fatto tutto e funziona tutto.. mi manca solo il controllo sul formato del file.
    Mi ritrovo già delle funzioni is_letter() e is_number() pensate appositamente per non stare a verificare sempre il carattere letto in più punti e più funzioni del programma...

    Il punto non è che non so verificare che carattere leggo o cose del genere... il punto è l'algoritmo
    se facessi solo un cntrollo sui caratteri letti ammettendo lettere numeri e CR non mi assicurerei che non ci sono righe vuote :\

    appunto pensavo ad un while su ogni riga... in modo che per ogni riga verifichi che ci sia almeno un carattere, e che tutti i caratteri siano o lettere o numeri...
    pensi che vada?
    poi ho un altro dubbio... getc() incrementa il file pointer... se uso getc() per leggere tutto il file e verificarne il formato, la chiamata successiva di getc() trova sempre eof o torna all'inizio? perchè nel primo caso mi dovrei copiare il puntatore per non perdermi il riferimento all'inizio del file che mi serve dopo questo controllo [se superato]....

    tnx

  9. #9
    beh bisogna prima definire cosa si intende per riga vuota
    potrebbe essere un solo CR oppure una serie di spazi seguiti da CR

    tu metti un flag rigavuota=0

    non appena trovi uno spazio poni rigavuota=1

    se incontri CR a uno o + caratteri in seguito, lasci rigavuota=1 se no per qualsiasi altra cosa trovi lo rimetti a 0
    rigavuota=1 lo metti anche se trovi CR in stringhe con lunghezza=1

    e in uscita controlli il valore di rigavuota

    comunque io queste cose le so fare con basic o al + pascal

    il C lo sto appena appena iniziando a studiare!

  10. #10
    Originariamente inviato da Caleb
    beh bisogna prima definire cosa si intende per riga vuota
    potrebbe essere un solo CR oppure una serie di spazi seguiti da CR

    tu metti un flag rigavuota=0

    non appena trovi uno spazio poni rigavuota=1

    se incontri CR a uno o + caratteri in seguito, lasci rigavuota=1 se no per qualsiasi altra cosa trovi lo rimetti a 0
    rigavuota=1 lo metti anche se trovi CR in stringhe con lunghezza=1

    e in uscita controlli il valore di rigavuota

    comunque io queste cose le so fare con basic o al + pascal

    il C lo sto appena appena iniziando a studiare!
    sì sì.. infatti pensavo proprio di giocare con flags.. ho solo un attimo di confusione su come organizzarmi il fluddo del controllo... ma sono stanchissimo.. domani a mente fresca mi verrà immediato spero

    per il resto mi resta il dubbio sul file pointer e getc()... farò delle prove...

    adesso sono + tranquillo su cosa controllare.. mettere il controllo in codice è secondario


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.