Może coś w rodzaju:
bool is_empty(std::ifstream& pFile)
{
return pFile.peek() == std::ifstream::traits_type::eof();
}
Krótkie i słodkie.
Z obawy do Twojego błędu, pozostałe odpowiedzi używać C-stylu dostępu do plików, w których można uzyskać FILE*
z określonych funkcji.
W przeciwieństwie do Ciebie i ja pracujemy ze strumieniami C++ i jako takie nie możemy ich używać. Powyższy kod działa w prosty sposób: peek()
wyświetli strumień i wróci, bez usuwania, następną postacią. Jeśli dojdzie do końca pliku, zwraca eof()
. Ergo, my po prostu peek()
w strumieniu i zobaczmy, czy to jest eof()
, ponieważ pusty plik nie ma nic do podglądania.
Uwaga: to również zwraca wartość true, jeśli plik nigdy nie został otwarty, co powinno działać w twoim przypadku. Jeśli nie chcesz, aby:
std::ifstream file("filename");
if (!file)
{
// file is not open
}
if (is_empty(file))
{
// file is empty
}
// file is open and not empty
Szkoda, że nie można łatwo uzyskać deskryptora pliku z 'fstream'. Możesz z łatwością sprawdzić pusty plik używając 'fstat', na Unixie. :-P –