Tal vez algo parecido a:
bool is_empty(std::ifstream& pFile)
{
return pFile.peek() == std::ifstream::traits_type::eof();
}
corto y dulce.
Con las preocupaciones a su error, las otras respuestas utilizar el acceso de archivos de tipo C, donde se obtiene una FILE*
con funciones específicas.
Por el contrario, usted y yo estamos trabajando con flujos de C++, y como tales no pueden usar esas funciones. El código anterior funciona de una manera simple: peek()
echará un vistazo a la transmisión y devolverá, sin eliminar, el siguiente carácter. Si llega al final del archivo, devuelve eof()
. Ergo, acabamos de llamar al peek()
en la transmisión y ver si es eof()
, ya que un archivo vacío no tiene nada que ver.
Nota, esto también devuelve verdadero si el archivo nunca se abrió en primer lugar, lo que debería funcionar en su caso. Si no desea que:
std::ifstream file("filename");
if (!file)
{
// file is not open
}
if (is_empty(file))
{
// file is empty
}
// file is open and not empty
Es una lástima que no pueda obtener fácilmente un descriptor de archivo de un 'fstream'. Puede verificar fácilmente un archivo vacío usando 'fstat', en Unix. :-P –