Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - c++ controllo se file txt è vuoto
Forum - C/C++ - c++ controllo se file txt è vuoto - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 13:51
Mercoledì, 24/06/2009
mmh... non proprio...

il tuo codice rivela i file inesistenti, quelli protetti dalla lettura, i file speciali di socket e qualche altro tipo di file speciale, ma l'autore del post chiedeva di rilevare file esistenti vuoti (cioè di lunghezza zero bytes).

fopen apre correttamente un file se questo è di zero bytes, quindi in alternativa dovresti aggiungere un paio di fseek, uno verso l'inizio del file (SEEK_SET) e uno verso la fine (SEEK_END), farti restituire la posizione del cursore tramite ftell e calcolare la differenza tra i due cursori. Se la differenza è pari a zero allora il file è vuoto.

Questo ovviamente è fattibile e portabile, ma spreca risorse e blocca un file durante la sua lettura. Se il test deve essere veloce allora consiglio l'uso di stat() eventualmente compilato con dei wrapper condizionali...


insomma, una cosa del genere:
Codice sorgente - presumibilmente C++

  1. int myStat(const char *filename, struct stat *buf)
  2. {
  3. #ifdef _WIN32
  4. return _stat(filename, buf);
  5. #else
  6. return stat(filename, buf);
  7. #endif
  8. }


in questo modo il codice diventa portabile ;)

nel tuo programma dovrai soltanto chiamare la funzione myStat(), sarà il compilatore a decidere quale versione compilare in base al sistema target.

Ultima modifica effettuata da il 24/06/2009 alle 13:52
PM Quote
Avatar
Xaratroom (Ex-Member)
Expert


Messaggi: 526
Iscritto: 03/04/2008

Segnala al moderatore
Postato alle 15:08
Mercoledì, 24/06/2009
Testo quotato

Postato originariamente da TheKaneB:

mmh... non proprio...

il tuo codice rivela i file inesistenti, quelli protetti dalla lettura, i file speciali di socket e qualche altro tipo di file speciale, ma l'autore del post chiedeva di rilevare file esistenti vuoti (cioè di lunghezza zero bytes).

fopen apre correttamente un file se questo è di zero bytes, quindi in alternativa dovresti aggiungere un paio di fseek, uno verso l'inizio del file (SEEK_SET) e uno verso la fine (SEEK_END), farti restituire la posizione del cursore tramite ftell e calcolare la differenza tra i due cursori. Se la differenza è pari a zero allora il file è vuoto.

Questo ovviamente è fattibile e portabile, ma spreca risorse e blocca un file durante la sua lettura. Se il test deve essere veloce allora consiglio l'uso di stat() eventualmente compilato con dei wrapper condizionali...


insomma, una cosa del genere:
Codice sorgente - presumibilmente C++

  1. int myStat(const char *filename, struct stat *buf)
  2. {
  3. #ifdef _WIN32
  4. return _stat(filename, buf);
  5. #else
  6. return stat(filename, buf);
  7. #endif
  8. }


in questo modo il codice diventa portabile ;)

nel tuo programma dovrai soltanto chiamare la funzione myStat(), sarà il compilatore a decidere quale versione compilare in base al sistema target.


Sono pienamente daccordo con te ... ma chi ha aperto la discussione ci avrà capito qualcosa ?

EDIT:
scusa mi era sfuggito per un attimo che voleva sapere se il file era vuoto e non se era leggibile.

Ultima modifica effettuata da Xaratroom il 24/06/2009 alle 15:13
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:16
Mercoledì, 24/06/2009
Testo quotato

Postato originariamente da Xaratroom:

Sono pienamente daccordo con te ... ma chi ha aperto la discussione ci avrà capito qualcosa ?



Beh, se non ha capito qualcosa siamo qui per aiutarlo, no? ^_^
se ci sono dei dubbi posso scrivere un pezzo di codice più ampio per illustrare la tecnica...
Testo quotato


EDIT:
scusa mi era sfuggito per un attimo che voleva sapere se il file era vuoto e non se era leggibile.



si, anch'io all'inizio avevo capito così :D

PM Quote
Avatar
carlito00w (Normal User)
Newbie


Messaggi: 10
Iscritto: 20/06/2009

Segnala al moderatore
Postato alle 19:10
Giovedì, 25/06/2009
Grazie MILLE

per la disponibilità :)

si vede che sai di cosa parli ;)

allora intanto ho risolto il problema con la seek, che avevo già provato (sotto linux però) con esiti non brillanti.

adesso sembra funzionare, anche se la deve applicare ai vari file e vedere come va.

sostituirei volentieri la funzione la seek cmq con la stat, solo che avrei bisogna di qualche delucidazione in più...

non ho capito ad esempio a cosa serve la struct al suo interno... se non ti crea disturbo, scambierei il mio contatto msn per delucidazioni più immediate e veloci... cmq sia:k:

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 19:41
Giovedì, 25/06/2009
Testo quotato

Postato originariamente da carlito00w:
non ho capito ad esempio a cosa serve la struct al suo interno...



molto semplice... la funzione seek restituisce tante informazioni, quindi il metodo più efficiente per contenere tutte le informazioni è quello di passare un puntatore ad una struct appropriata, così la funzione provvederà a riempire i relativi campi con i valori di ritorno.

Questo è un classico esempio di funzione che invece di restituire il valore richiesto, inserisce i risultati (tanti) all'interno di una struct, e ritorna solo un codice di errore (in questo caso 0 == tutto ok, -1 == errore)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo