2012-11-23 184 views
0

儘管所有參數都是正確的,但它返回讀取項目的正確值,函數fread_s不會講述「bytes」中的任何內容爲空。當我交換時,它也是空的10485760 & 1.有誰知道是什麼原因導致了這個問題?根本沒有問題。爲什麼fread_s不能在這個C代碼中工作?

float EncryptBig(CRYPTIN* handle) 
{ 
    int i, index = 0; 
    float calc; 
    char* bytes; 

    i = (handle->size - handle->huidig); 
    if ((i-10485760) < 0) 
    { 
     bytes = (char*)malloc(i); 
     if (bytes == NULL) 
     { 
      fcloseall(); 
      free(handle); 
      return 100.0f; 
     } 

     fread_s(&bytes, i, 1, i, handle->bestand); // Here and down below 
     fclose(handle->bestand); 

     for (index = 0; index < i; index++) 
     { 
      __asm 
      { 
       mov   eax, dword ptr [bytes] 
       add   eax, dword ptr [index] 
       mov   cl, byte ptr [eax] 
       xor   cl, 101 
       xor   cl, 53 
       not   cl 
       mov   byte ptr [eax], cl 
       mov   eax, dword ptr [index] 
       add   eax, 1 
       mov   dword ptr [index], eax 
      } 
     } 

     fwrite(bytes, 1, i, handle->nieuwbstnd); 
     fclose(handle->nieuwbstnd); 
     free(handle); 
     free(bytes); 

     return 100.0f; 
    } 

    if (handle->huidig == 0) 
    { 
     fseek(handle->bestand, 0, SEEK_SET); 
     fseek(handle->nieuwbstnd, 0, SEEK_SET); 
    } 

    bytes = (char*)malloc(10485760); 
    if (bytes == NULL) 
    { 
     fcloseall(); 
     free(handle); 
     return 100.0f; 
    } 
    fread_s(bytes, 10485760, 10485760, 1, handle->bestand); // Here 

    for (index = 0; index < 10485760; index++) 
    { 
     __asm 
     { 
      mov   eax, dword ptr [bytes] 
      add   eax, dword ptr [index] 
      mov   cl, byte ptr [eax] 
      xor   cl, 101 
      xor   cl, 53 
      not   cl 
      mov   byte ptr [eax], cl 
      mov   eax, dword ptr [index] 
      add   eax, 1 
      mov   dword ptr [index], eax 
     } 
    } 

    fwrite(bytes, 1, 10485760, handle->bestand); 
    free(bytes); 
    handle->huidig += 10485760; 
    handle->positie += 10485760; 
    fseek(handle->bestand, handle->huidig, SEEK_SET); 
    fseek(handle->nieuwbstnd, handle->positie, SEEK_SET); 
    calc = (float)handle->huidig; 
    calc /= (float)handle->size; 
    calc *= 100.0f; 

    if (calc >= 100.0) 
    { 
     fclose(handle->bestand); 
     fclose(handle->nieuwbstnd); 
     free(handle); 
    } 

    return calc; 
} 

編輯:解決

+0

'fwrite(bytes,1,10485760,handle-> bestand);'< - 你不想寫'handle-> nieuwbstnd'嗎? –

+0

如果你不檢查'fread_s()'的返回值,你怎麼知道有什麼問題?此外,通過指定錯誤報告功能,您可以控制錯誤報告(至少在「* _s()」函數的TR24731或C 2011版本中)。 –

+0

寫if'((i-10485760)<0)'而不是更簡單,更清晰的if(i <10485760)'有什麼好處? Fortran II曾經需要類似於這種迂迴的東西,但Fortran IV(又名Fortran 66)終止了這種需求。 –

回答

2

不知道這是你的具體問題,但它東西你的代碼錯誤。

當你做一個fread通話時,您指定「對象」你要多少閱讀和物體的大小,然後fread將讀取高達許多對象。但它會讀取這些對象的確切數字

因此,當您嘗試從七個字節的文件中讀取一百萬個單字節對象時,您將獲得其中七個,並且返回碼將反映這一點。但是,如果您嘗試讀取一百萬字節的對象,則完全不會得到任何結果,並且返回碼將反映出這一點。

我強調返回值的原因是,您可能會收回比您想要的更少的對象(例如,如果您要求1000個單字節對象,而文件中只剩900個左側對象),請盲目編寫預期的達到輸出文件是否是否定的。你需要檢查返回代碼並對其執行操作。

此外,作爲一個評論者指出的那樣,你會出現在你的輸出語句之一被寫回輸入文件:

fwrite (bytes, 1, 10485760, handle->bestand); 

那是不可能有好下場的:-)它或許應該是:

fwrite (bytes, 1, 10485760, handle->nieuwbstnd); 
+0

但它足夠大(100MB),我檢查了以前的代碼文件有多大。我說,讀取10485760 1個字節也不行(即使它返回10485760)。 – para

+0

@Ruben,這個文件有多大並不重要,'fread'可能仍然會讓你減少,你應該允許。 – paxdiablo

+0

寫入輸入文件是個問題,字節的值沒有在調試器中顯示出來(我想大)。 – para

2
bytes = (char*)malloc(i); 
// etc. 
fread_s(&bytes, i, 1, i, handle->bestand); // Here and down below 

你要bytes這裏,不&bytes因爲在地址是你的緩衝區所在的地方。

+0

我真的很驚訝,它不會在你身上崩潰,但它是未定義的行爲,所以任何事情都可能發生(甚至沒有)。 :) –

+0

謝謝,我沒有看到:) – para

+0

我也沒有,+1,這可能是一個問題。 – paxdiablo

相關問題