Сравнить 2 файла на C по размеру

#c #function #compare

#c #функция #Сравнить

Вопрос:

У меня есть этот код, но он выдает ошибку в строке 5 (fseek).

 int cmpFILEd(void *aa,void *bb){
    int size1,size2;
    FILE *a=(FILE*)aa;
    FILE *b=(FILE*)bb;
    fseek(a,0,SEEK_END);
    fseek(b,0,SEEK_END);
    size1=ftell(a);
    size2=ftell(b);
    if(size1==size2)
        return 0;
    else if(size1>size2)
        return 1;
    else 
        return -1;
}
  

В чем проблема в этом коде?

_

РЕДАКТИРОВАТЬ: ошибка:

Исключение первой возможности в 0x77052865 (ntdll.dll ) в cFILE.exe: 0xC0000008: Был указан недопустимый дескриптор.

Если есть обработчик для этого исключения, программа может быть безопасно продолжена.

Комментарии:

1. Пожалуйста, покажите, как вы вызываете эту функцию.

2. попробуйте FILE *a=*(FILE**)aa;

3. Я действительно рекомендую вам изменить подпись этой функции, чтобы получить FILE * вместо void *.

4. Теперь я попытался запустить ее, отправив 2 ФАЙЛА * в вашу исходную функцию, и это сработало

5. Кажется, вы хотите передать адрес этой функции в qsort или тому подобное. Вы должны добавить это к своему вопросу, если это так, ответы, похоже, не касаются этого. См. комментарий Bluepixy.

Ответ №1:

Учитывая, что:
1) OP «… не могу изменить пустоту, она должна быть универсальной».
2) int cmpFILEd(void *aa,void *bb) является функцией сравнения

Это выглядит как неправильно сформированная функция сравнения для qsort() или подобного.

В этом случае передаваемые указатели являются адресами FILE * , как предложено @BLUEPIXY,

 int cmpFILEd(void *aa,void *bb){
  long size1, size2;  // Note use long here
  FILE *a = *((FILE**) aa);
  FILE *b = *((FILE**) bb);
  ...
  

Ответ №2:

Если вы действительно настаиваете на том, чтобы использовать void *, а не FILE *, это сработает, если вы отправите 2 ФАЙЛА *.

Я запускаю следующий код:

 #include <stdio.h>

int cmpFILEd(void *aa,void *bb){
    int size1,size2;
    FILE *a=(FILE*)aa;
    FILE *b=(FILE*)bb;
    fseek(a,0,SEEK_END);
    fseek(b,0,SEEK_END);
    size1=ftell(a);
    size2=ftell(b);
    if(size1==size2)
        return 0;
    else if(size1>size2)
        return 1;
    else 
        return -1;
}

int main(){
  FILE* f1 = fopen("file1","r");
  FILE* f2 = fopen("file2","r");
  int x = cmpFILEd(f1,f2);
  printf("%dn", x);
  return 0;
}
  

Я получил -1 при вводе 2 файлов с содержимым «first» и «second» соответственно.

Ответ №3:

Возможно, если бы вы упростили код?

 int cmpFILEd(FILE *a, FILE *b)
   {
   fseek(a, 0, SEEK_END);
   fseek(b, 0, SEEK_END);

   return ftell(a) > ftell(b) ? 1 : 0;
   }
  

Если определение функции не может измениться, возможно:

 int cmpFILEd(void *a, void *b)
   {
   fseek((FILE *)a, 0, SEEK_END);
   fseek((FILE *)b, 0, SEEK_END);

   return ftell((FILE *)a) > ftell((FILE *)b) ? 1 : 0;
   }
  

Менее академическая версия может помочь диагностировать проблему:

 int cmpFILEd(void *a, void *b)
   {
   long aSize=0;
   long bSize=0;

   errno=0;
   if((-1) == fseek((FILE *)a, 0, SEEK_END))
      {
      fprintf(stderr, "fseek(a...) failed.  errno:%dn");
      goto CLEANUP;
      }

   errno=0;
   if((-1) == fseek((FILE *)b, 0, SEEK_END))
      {
      fprintf(stderr, "fseek(b...) failed.  errno:%dn");
      goto CLEANUP;
      }

   errno=0;
   if((-1) == (aSize=ftell((FILE *)a)))
      {
      fprintf(stderr, "ftell(a) failed.  errno:%dn");
      goto CLEANUP;
      }

   errno=0;
   if((-1) == (bSize=ftell((FILE *)b)))
      {
      fprintf(stderr, "ftell(b) failed.  errno:%dn");
      goto CLEANUP;
      }

CLEANUP:

   return(aSize > bSize ? 1 : 0);
   }