Как проверить, содержит ли файл содержимое или нет с помощью c?

У меня есть исходный файл file1 и файл назначения file2здесь я должен переместить контент из file1 в file2,

Поэтому сначала я должен сделать некоторую проверку.

  1. Я должен проверить, существует ли исходный файл или нет? Я могу проверить, используя это:

    fp = fopen( argv[1],"r" );
    if ( fp == NULL )
    {
        printf( "Could not open sourse file\n" );
        exit(1);
    } 
    
  2. Тогда я должен проверить исходный файл есть содержание или нет? Если там пусто, надо скинуть какую-нибудь ошибку.

Это то, что я пробовал до настоящего момента.

8 ответов

C версия:

if (NULL != fp) {
    fseek (fp, 0, SEEK_END);
    size = ftell(fp);

    if (0 == size) {
        printf("file is empty\n");
    }
}

Версия C++ (украдена отсюда):

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

Вы можете сделать это, не открывая файл, также используя stat метод.

#include <sys/stat.h>
#include <errno.h>

int main(int argc, char *argv[])
{

     struct stat stat_record;
     if(stat(argv[1], &stat_record))
         printf("%s", strerror(errno));
     else if(stat_record.st_size <= 1)
         printf("File is empty\n");
     else {
         // File is present and has data so do stuff...
     }

Так что если файл не существует, вы нажмете первый if и получите сообщение как: "No such file or directory"

Если файл существует и пуст, вы получите второе сообщение "File is empty"

Эта функциональность существует как в Linux, так и в Windows, но на Win это _stat, Я еще не тестировал код Windows, но вы можете увидеть его примеры здесь.

Просто посмотрите, есть ли персонаж для чтения

int c = fgetc(fp);
if (c == EOF) {
    /* file empty, error handling */
} else {
    ungetc(c, fp);
}
fseek(fp, 0, SEEK_END); // goto end of file
if (ftell(fp) == 0)
 {
      //file empty
 }
fseek(fp, 0, SEEK_SET); // goto begin of file
// etc;

ссылка на пример и пример

ссылка на fseek и пример

Вы можете использовать fseek используя SEEK_END и затем ftell, чтобы получить размер файла в байтах.

Вы можете использовать feof() функция. пример:

if(feof(file))
{
    printf("empty file\n");
}

Вы можете проверить, если размер файла> 0

после того, как ваш код проверки файла существует (перед закрытием файла), вы добавляете следующий код

   size = 0
    if(fp!=NULL)
    {
        fseek (fp, 0, SEEK_END);

        size = ftell (fp);
        rewind(fp);

    }
    if (size==0)
    {
      // print your error message here
     }

Больно открывать данные и считать каждый байт файла. Лучше попросить операционную систему предоставить вам подробную информацию о файлах, которые вы хотите использовать. API зависит от вашей операционной системы, как ранее говорил Майк.

Другие вопросы по тегам