#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);
}