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

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

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

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

myFunction(ifstream &inFile)

11 ответов

Решение

Возможно, что-то сродни

bool is_empty(std::ifstream& pFile)
{
    return pFile.peek() == std::ifstream::traits_type::eof();
}

Коротко и сладко.


Что касается вашей ошибки, другие ответы используют доступ к файлам в стиле C, где вы получаете FILE* с конкретными функциями.

Наоборот, вы и я работаем с потоками C++, и поэтому не можем использовать эти функции. Приведенный выше код работает в простой форме: 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

Итак, этот кусок кода должен работать для вас. Я изменил имена, чтобы соответствовать вашему параметру.

inFile.seekg(0, ios::end);  
if (inFile.tellg() == 0) {    
  // ...do something with empty file...  
}

Найдите в конце файла и проверьте позицию:

 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 Функция и проверить размер файла напрямую.

Решение C++17 :

      #include <filesystem>

const auto filepath = <path to file> (as a std::string or std::filesystem::path)

auto isEmpty = (std::filesystem::file_size(filepath) == 0);

Предполагается, что у вас есть сохраненное местоположение пути к файлу, я не думаю, что вы можете извлечь путь к файлу из std::ifstream объект.

Используйте это: data.peek()!= '\0'

Я искал час, пока, наконец, это не помогло!

Если ваш вариант использования предлагает возможность проверки на пустоту перед открытием файла,
C++17 предоставляет вамis_empty

      #include <filesystem>

if (!std::filesystem::is_empty("path.txt")) {
     ///Open and use the file
}
char ch;
FILE *f = fopen("file.txt", "r");

if(fscanf(f,"%c",&ch)==EOF)
{
    printf("File is Empty");
}
fclose(f);

когда файл пуст, tellg даст вам значение 0, если он пуст, поэтому сосредоточьтесь на этом, и это самый простой способ найти пустой файл, если вы просто создаете файл, он даст вам -1.

      outfile.seekg(0,ios::end);
if(file.tellg()<1){
  //empty
}else{
  file.clear(); // clear all flags(eof)
  file.seekg(0,ios::beg);//reset to front
  //not empty
}

Как насчет (не элегантный способ, хотя)

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;
}
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;
}
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
  fseek(pFile, 0, SEEK_SET);
  do something...
}

fclose(pFile)
Другие вопросы по тегам