2010-03-06 4 views
31

Existe-t-il un moyen simple de vérifier si un fichier est vide? Comme si vous passez un fichier à une fonction et que vous vous rendez compte qu'il est vide, alors vous le fermez tout de suite? Merci. Edit, j'ai essayé d'utiliser la méthode fseek, mais j'obtiens une erreur disant 'ne peut pas convertir ifstream en FICHIER *'.Recherche d'un fichier vide en C++

paramètre Ma fonction est

myFunction(ifstream &inFile) 
+0

Il est dommage que vous ne puissiez pas facilement obtenir un descripteur de fichier à partir d'un 'fstream'. Vous pouvez facilement vérifier un fichier vide en utilisant 'fstat', sous Unix. :-P –

Répondre

50

Peut-être quelque chose comme:

bool is_empty(std::ifstream& pFile) 
{ 
    return pFile.peek() == std::ifstream::traits_type::eof(); 
} 

court et doux.


Avec les préoccupations de votre erreur, les autres réponses utiliser l'accès aux fichiers de style C, où vous obtenez un FILE* avec des fonctions spécifiques. Par contre, vous et moi travaillons avec des flux C++ et, en tant que tels, ne pouvons pas utiliser ces fonctions. Le code ci-dessus fonctionne d'une manière simple: peek() regardera le flux et retournera, sans enlever, le prochain caractère. S'il atteint la fin du fichier, il renvoie eof(). Ergo, nous avons juste peek() au flux et voir si c'est eof(), puisqu'un fichier vide n'a rien à voir. Notez que cela renvoie également vrai si le fichier n'a jamais ouvert en premier lieu, ce qui devrait fonctionner dans votre cas. Si vous ne voulez pas que:

std::ifstream file("filename"); 

if (!file) 
{ 
    // file is not open 
} 

if (is_empty(file)) 
{ 
    // file is empty 
} 

// file is open and not empty 
+0

ne serait pas trop difficile à ajouter 'return pFile.tellg()> 0 || ... ' – Potatoswatter

+1

Quelle réponse ... – IssamTP

5

Seek à la fin du fichier et vérifiez la position:

fseek(fileDescriptor, 0, SEEK_END); 
if (ftell(fileDescriptor) == 0) { 
    // file is empty... 
} else { 
    // file is not empty, go back to the beginning: 
    fseek(fileDescriptor, 0, SEEK_SET); 
} 

Si vous ne possédez pas le fichier déjà ouvert, il suffit d'utiliser la fonction fstat et vérifiez la taille du fichier directement.

0
pFile = fopen("file", "r"); 
fseek (pFile, 0, SEEK_END); 
size=ftell (pFile); 
if (size) { 
    fseek(pFile, 0, SEEK_SET); 
    do something... 
} 

fclose(pFile) 
+1

format le code en utilisant le bouton de la barre d'outils qui ressemble à «100110» – t0mm13b

+0

code maladroit. Non recommandé. – SmallChess

7

Ok, donc ce morceau de code devrait fonctionner pour vous. J'ai changé les noms pour correspondre à votre paramètre.

inFile.seekg(0, ios::end); 
if (inFile.tellg() == 0) {  
    // ...do something with empty file... 
} 
1
char ch; 
FILE *f = fopen("file.txt", "r"); 

if(fscanf(f,"%c",&ch)==EOF) 
{ 
    printf("File is Empty"); 
} 
fclose(f); 
+1

Pourquoi utiliseriez-vous ces C idioms en C++? –

0

Que diriez-vous (façon élégante mais pas)

int main(int argc, char* argv[]) 
{ 
    std::ifstream file; 
    file.open("example.txt"); 

    bool isEmpty(true); 
    std::string line; 

    while(file >> line) 
     isEmpty = false; 

     std::cout << isEmpty << std::endl; 
} 
+1

Assez juste. C'est un peu mieux (en raison de C_actuel_ C++, pas C) que de l'utilisateur4471014, bien que toujours entièrement inutile et sous-optimal. –

+0

@ LightnessRacesinOrbit, vous avez raison, cependant pas besoin de passer par toutes les lignes d'un fichier.La boucle while peut être arrêtée une fois la première ligne détectée et mettre 'isEmpty' à' false'. Si cela pouvait améliorer le code. – CroCo

+0

Je peux comprendre que ce code est sous-optimal, mais pourquoi est-ce un gaspillage? Le PO ne demande pas ou ne cherche pas un code suffisant ou si optimisé. – CroCo

-1
if (nfile.eof()) // Prompt data from the Priming read: 
    nfile >> CODE >> QTY >> PRICE; 
else 
{ 
    /*used to check that the file is not empty*/ 
    ofile << "empty file!!" << endl; 
    return 1; 
} 
+1

Bien que ceci puisse fournir une solution à la question d'OP, il n'y a aucune explication du code. –

1

utilisation ceci: data.peek() = « \ 0! '

J'ai cherché pendant une heure jusqu'à ce que finalement cela m'a aidé!

+0

Comment est-ce mieux que la réponse acceptée? – Norrius