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
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 –