Подтвердить что ты не робот

Проверка пустого файла на С++

Есть ли простой способ проверить, является ли файл пустым. Например, если вы передаете файл функции, и вы понимаете его пустым, то сразу же закрываете его? Спасибо.

Изменить, я пробовал использовать метод fseek, но я получаю сообщение об ошибке "Не могу преобразовать ifstream в FILE *".

Мой параметр функции

myFunction(ifstream &inFile)
4b9b3361

Ответ 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;
}