PDA

View Full Version : [C++] Controllare se un file è vuoto


vendettaaaaa
21-01-2012, 22:54
Stavo pensando ai vari modi per controllare se un file è vuoto, cioè non ci sono caratteri oppure ci sono solo whitespace (mi limito a spazio, newline, tab).
Ne sono venuto fuori con questo:
// Check for empty file
char c;
while (fileIn.get(c)) {
// If c is not a whitespace, go back 1 char and quit the loop
if (c != ' ' && c != '\n' && c != '\t') {
fileIn.unget();
break;
}

// If so far there were only whitespaces, and peek() generates eof() == 1, file is empty
fileIn.peek();
if (fileIn.eof()) {
cout << endl << "The file is empty, you monkey!!" << endl;
return 0;
}
}

che sembra funzionare per file che contengono almeno un whitespace. Se il file invece è proprio vuoto, il loop while non parte perchè fileIn.get(c) fallisce. Dovrei quindi aggiungere un paio di righe:
// Check for empty file
char c;
while (fileIn.get(c)) {
// If c is not a whitespace, go back 1 char and quit the loop
if (c != ' ' && c != '\n' && c != '\t') {
fileIn.unget();
break;
}

// If so far there were only whitespaces, and peek() generates eof() == 1, file is empty
fileIn.peek();
if (fileIn.eof()) {
cout << endl << "The file is empty, you monkey!!" << endl;
return 0;
}
}
if (fileIn.eof()) {
cout << endl << "The file is empty, you monkey!!" << endl;
return 0;
}

Un altro modo sarebbe controllare prima del loop:
// Check for empty file
fileIn.peek();
if (fileIn.eof()) {
cout << endl << "The file is empty, you monkey!!" << endl;
return 0;
}
char c;
while (fileIn.get(c)) {
// If c is not a whitespace, go back 1 char and quit the loop
if (c != ' ' && c != '\n' && c != '\t') {
fileIn.unget();
break;
}

// If so far there were only whitespaces, and peek() generates eof() == 1, file is empty
fileIn.peek();
if (fileIn.eof()) {
cout << endl << "The file is empty, you monkey!!" << endl;
return 0;
}
}

Ho sbagliato molto in passato perchè non sapevo che eof() è posto = 1 dalla precedente lettura del file, ma ora che lo so gli faccio precedere un peek() che, seppur non estrae alcun carattere, si accorge se la fine del file è arrivata.
A parte questo, che ne pensate di questo metodo? Ce ne sono di migliori (ed intendo più efficienti)? Questo (3° versione) mi pare carino: se il file è vuoto se ne accorge subito, se ci sono un sacco di spazi vuoti prima della prima lettera di testo li salta (il cursore del file torna indietro con unget() e da lì continua).
Ci sono bug che mi sfuggono?

clockover
22-01-2012, 00:21
Se ne è parlato circa una settimanella fa.... controlli semplicemente la dimensione... 3 comandi, 3 righe di codice

1) fopen
2) fseek
3) ftell

vendettaaaaa
22-01-2012, 01:16
Se ne è parlato circa una settimanella fa.... controlli semplicemente la dimensione... 3 comandi, 3 righe di codice

1) fopen
2) fseek
3) ftell
Uhm allora userò la ricerca, come avrei già dovuto fare :stordita:

vendettaaaaa
22-01-2012, 09:28
Uhm uhm, parli di questo esempio:
#include <stdio.h>

int main ()
{
FILE * pFile;
long size;

pFile = fopen ("myfile.txt","rb");
if (pFile==NULL) perror ("Error opening file");
else
{
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
fclose (pFile);
printf ("Size of myfile.txt: %ld bytes.\n",size);
}
return 0;
}
Però se il file è fatto di whitespace non se ne accorge! E poi voglio usare le classi di fstream, non le vecchie funzioni del C :read:

clockover
22-01-2012, 09:36
Però se il file è fatto di whitespace non se ne accorge! E poi voglio usare le classi di fstream, non le vecchie funzioni del C :read:

a si ok adesso ho capito non avevo letto bene la tua richiesta... tu vuoi vedere se il file è vuoto oppure se non lo è se ha solo spazi whitespace, tabs, newline, ecc... allora misà che ti tocca leggere tutto il file

vendettaaaaa
22-01-2012, 09:48
a si ok adesso ho capito non avevo letto bene la tua richiesta... tu vuoi vedere se il file è vuoto oppure se non lo è se ha solo spazi whitespace, tabs, newline, ecc... allora misà che ti tocca leggere tutto il file
Eh infatti per quello chiedevo se ci fossero metodi più efficienti...anche se tutto sommato, a meno di file giganti direi che il metodo va già bene.