【问题标题】:Compare 2 FILEs in C by Size按大小比较 C 中的 2 个文件
【发布时间】:2014-07-05 15:52:34
【问题描述】:

我有这段代码,但它在第 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: 指定的句柄无效。

如果有这个异常的处理程序,程序可能是安全的 继续。

【问题讨论】:

  • 请说明你是如何调用这个函数的。
  • 试试FILE *a=*(FILE**)aa;
  • 我真的建议您更改此函数的签名以获取 FILE* 而不是 void*。
  • @blue 你说得对,谢谢!!
  • 现在我尝试通过将 2 FILE* 发送到您的原始函数来运行它并且它起作用了

标签: c function compare


【解决方案1】:

鉴于:
1) OP“......不能改变它需要通用的 void。”
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 个 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,内容分别为“第一”和“第二”。

    【讨论】:

      【解决方案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:%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);
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多