Проверка пустого файла на С++
Есть ли простой способ проверить, является ли файл пустым. Например, если вы передаете файл функции, и вы понимаете его пустым, то сразу же закрываете его? Спасибо.
Изменить, я пробовал использовать метод fseek, но я получаю сообщение об ошибке "Не могу преобразовать ifstream в FILE *".
Мой параметр функции
myFunction(ifstream &inFile)
Ответы
Ответ 1
Возможно, что-то похожее на:
bool is_empty(std::ifstream& pFile)
{
return pFile.peek() == std::ifstream::traits_type::eof();
}
Короткий и сладкий.
С учетом вашей ошибки другие ответы используют доступ к файлам в стиле C, где вы получаете FILE*
с определенными функциями.
Напротив, мы с вами работаем с потоками С++ и поэтому не можем использовать эти функции. Вышеприведенный код работает простым способом: peek()
заглянет в поток и вернет, не удаляя, следующий символ. Если он достигнет конца файла, он возвращает eof()
. Ergo, мы просто peek()
в потоке и видим, если он eof()
, так как пустому файлу нечего заглядывать.
Примечание. Это также возвращает true, если файл никогда не открывается в первую очередь, что должно работать в вашем случае. Если вы этого не хотите:
std::ifstream file("filename");
if (!file)
{
// file is not open
}
if (is_empty(file))
{
// file is empty
}
// file is open and not empty
Ответ 2
Хорошо, поэтому этот кусок кода должен работать на вас. Я изменил имена в соответствии с вашим параметром.
inFile.seekg(0, ios::end);
if (inFile.tellg() == 0) {
// ...do something with empty file...
}
Ответ 3
Ищите конец файла и проверьте позицию:
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);
}
Если у вас еще нет открытого файла, просто используйте функцию fstat
и напрямую проверьте размер файла.
Ответ 4
char ch;
FILE *f = fopen("file.txt", "r");
if(fscanf(f,"%c",&ch)==EOF)
{
printf("File is Empty");
}
fclose(f);
Ответ 5
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
fseek(pFile, 0, SEEK_SET);
do something...
}
fclose(pFile)
Ответ 6
Как насчет (не элегантный способ)
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;
}
Ответ 7
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;
}