2017-05-18 45 views
0

我的代码存在一些问题,代码没有编译,但是当我测试代码时,我发现如果签名位于文件末尾(或文件中间),该程序不起作用。文件签名C

int normalScan(char * fileName, char * sign){ 
    int toReturn = 0; 
    FILE * toScan = fopen(fileName,"rb"); 
    FILE * signature = fopen(sign, "rb"); 
    char * buffer = NULL; 
    char * secondBuffer = NULL; 
    int size = 0; 
    int secondSize = 0; 
    int elements = 0; 
    int i = 0; 

    fseek(signature, 0, SEEK_END); 
    size = ftell(signature); 
    rewind(signature); 

    fseek(toScan, 0, SEEK_END); 
    secondSize = ftell(toScan); 
    rewind(toScan); 

    buffer = malloc(sizeof(char)*size); 
    elements = fread(buffer, 1, size, signature); 

    secondBuffer = malloc(sizeof(char)*size); 
    elements = fread(secondBuffer, 1, size, toScan); 

    if (strcmp(secondBuffer, buffer) == 0){ 
     toReturn = 1; 
    } 
    else{ 
     while (fgetc(toScan) != EOF && fgetc(signature) != EOF){ 
      rewind(signature); 
      fseek(toScan, -1, SEEK_CUR); 
      if (fgetc(toScan) == fgetc(signature)){ 
       rewind(signature); 
       fseek(toScan, -1, SEEK_CUR); 
       elements = fread(secondBuffer, 1, size, toScan); 

       if (strcmp(secondBuffer, buffer) == 0){ 
        toReturn = 1; 
       } 
      } 

      rewind(signature); 
      strncpy(secondBuffer, "", sizeof(secondBuffer)); 
     } 
    } 

    free(secondBuffer); 
    fclose(toScan); 
    fclose(signature); 
    free(buffer); 

    return toReturn; 
} 
+2

请看[为什么“while(!feof(file))”总是出错?](http://stackoverflow.com/q/5431941/2173917) –

+2

[不要将'malloc'的结果强制转换为C](http://stackoverflow.com/q/605845/995714) –

+1

你可能想说几句关于你的代码打算做什么的话。代码本身并不是很清楚。它是否在文件中搜索已知的签名? –

回答

0

你有4个问题:

1)您没有在此范围内检查EOF签名:

while (!feof(toScan)){ 
     if (fgetc(toScan) == fgetc(signature)){ 
      fseek(signature, 0, SEEK_SET); 

您可以检查龟etc(TOSCAN)和龟etc(签名)EOF或使用!feof(签名)。如果签名不存在且文件大小为0,则表示遇到问题。你不应该依赖的情况下,该文件将始终有一些数据

2)您的代码可能包含算法错误。逐步检查你的代码执行与debuger或只是遵循代码行。

3)检查fopen是否返回非零值;检查文件是否已成功打开。

另外fseek(signature,0,SEEK_SET);和倒带(签名);可以条纹下来快退(签名)在本例中:

 while (fgetc(toScan) != EOF && fgetc(signature) != EOF){ 
     // deleted rewind 
     fseek(toScan, -1, SEEK_CUR); 
     if (fgetc(toScan) == fgetc(signature)){ 
      rewind(signature); 
      fseek(toScan, -1, SEEK_CUR); 
      elements = fread(secondBuffer, 1, size, toScan); 

      if (strcmp(secondBuffer, buffer) == 0){ 
       toReturn = 1; 
      } 
     } 

     rewind(signature); 
     strncpy(secondBuffer, "", sizeof(secondBuffer)); 
    } 

与此:

 while (fgetc(toScan) != EOF && fgetc(signature) != EOF){ 
     rewind(signature); 
     fseek(toScan, -1, SEEK_CUR); 
     if (fgetc(toScan) == fgetc(signature)){ 
      // deleted rewind 
      fseek(toScan, -1, SEEK_CUR); 
      elements = fread(secondBuffer, 1, size, toScan); 

      if (strcmp(secondBuffer, buffer) == 0){ 
       toReturn = 1; 
      } 
     } 

     rewind(signature); 
     strncpy(secondBuffer, "", sizeof(secondBuffer)); 
    } 

,因为它总是会设置标志光标为0

4)你看起来像你不完全了解如何在C上编码。请阅读C参考资料并阅读Herbert Schildt关于C的书籍。 您的营养价值为:


这里一些提示您:

1)检查你的算法(它是工作或没有)

2)重写代码(尽量做到用简单的代码你的目标,使用非标准STD是* .h函数)

3)用debuger(使用IDE,编译器标志等)调试你的程序。

+0

请看编辑。 – Saga

+0

谢谢,我改变了我的算法,它工作。 顺便说一句,我想问你,我怎么能设置while循环停止时,它到达文件的中间,而不是结束? – Saga