web-dev-qa-db-fra.com

Recherche d'un fichier vide en C ++

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 réalisez qu'il est vide, vous le fermez tout de suite? Merci.

Edit, j'ai essayé d'utiliser la méthode fseek, mais j'obtiens une erreur disant 'impossible de convertir ifstream en FILE *'.

Le paramètre de ma fonction est

myFunction(ifstream &inFile)
37
Crystal

Peut-être quelque chose qui ressemble à:

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

Court et doux.


En ce qui concerne votre erreur, les autres réponses utilisent l'accès aux fichiers de style C, où vous obtenez un FILE* Avec des fonctions spécifiques.

Au contraire, vous et moi travaillons avec des flux C++ et, en tant que tels, nous ne pouvons pas utiliser ces fonctions. Le code ci-dessus fonctionne de manière simple: peek() va jeter un œil au flux et retourner, sans supprimer, le caractère suivant. S'il atteint la fin du fichier, il renvoie eof(). Ergo, nous avons juste peek() au flux et voyons si c'est eof(), car un fichier vide n'a rien à voir.

Remarque, cela renvoie également true si le fichier ne s'est jamais ouvert en premier lieu, ce qui devrait fonctionner dans votre cas. Si vous ne voulez pas ça:

std::ifstream file("filename");

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

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

// file is open and not empty
68
GManNickG

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...  
}
8
pajton

Recherchez 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 n'avez pas déjà ouvert le fichier, utilisez simplement la fonction fstat et vérifiez directement la taille du fichier.

6
Mehrdad Afshari

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

Je cherche depuis une heure jusqu'à ce que cela aide finalement!

1
Vytaute
char ch;
FILE *f = fopen("file.txt", "r");

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

Que diriez-vous (pas d'une manière élégante cependant)

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;
}
0
CroCo
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
  fseek(pFile, 0, SEEK_SET);
  do something...
}

fclose(pFile)
0
sizzzzlerz