比较C中的2个FILE大小

时间:2014-07-05 15:52:35

标签: c function compare

我有这个代码,但它在第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;
}

此代码有什么问题?

_

编辑:错误:

  

cFILE.exe中0x77052865(ntdll.dll)的第一次机会异常:   0xC0000008:指定了无效句柄。

     

如果存在此异常的处理程序,则程序可能是安全的   继续进行。

3 个答案:

答案 0 :(得分:1)

也许你是要简化代码?

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:%d\n");
      goto CLEANUP;
      }

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

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

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

CLEANUP:

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

答案 1 :(得分:1)

如果你真的坚持虚空*而不是FILE *,那么如果你发送2 FILE *就会有效。

我运行以下代码:

#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("%d\n", x);
  return 0;
}

输入2个文件时,我得到-1,内容分别为“第一个”和“第二个”。

答案 2 :(得分:1)

鉴于:
1)OP&#34; ...无法改变其需要通用的空白。&#34;
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);
  ...