2014-02-08 52 views
0

64位我有這樣的超級簡單的代碼,其中我讀的8個字節的塊(I稍後將在代碼加密它們),然後將它們在一個新的文件寫下來。讀取和寫入64位通過用C

它運行良好,但最後8個字節沒有被寫入。任何想法爲什麼?

#include <stdbool.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <stdint.h> 

int main() 
{ 
    uint64_t data; 
    FILE *input, *output; 

    // create output file 

    output = fopen("output.txt", "w"); 

    // read file 
    input = fopen("test.txt", "rb"); 

    if(input) 
    { 
     while(fread(&data, 8, 1, input) == 1) 
     { 
      fwrite(&data, 8, 1, output); 
     } 

     size_t amount; 
     while((amount = fread(&data, 1, 8, input)) > 0) 
     { 
     fwrite(&data, 1, amount, output); 
     } 

     fclose(input); 
     fclose(output); 
    } 

    return EXIT_SUCCESS; 
} 
+0

它是一個文本文件嗎?名字'test.txt'表明這一點。也許有一些換行符不計算,輸入文件的大小不是8字節的倍數。此外,你不應該假設CHAR_BIT == 8或sizeof(uint64_t)== 8 –

+0

是的,它是一個簡單的文本文件,有一些行。它不是8個字節的倍數,應該是?我可能會在這裏錯過一些東西。 sizeof(uint64_t)怎麼能和8不同? –

+0

如果您在使用64位字符的機器上工作,sizeof(uint64_t)可能爲1.如果輸入文件的大小不是8的倍數,那麼您的循環將輸入一次太少,因爲fread返回0當沒有足夠的數據來滿足請求的大小時。 –

回答

2
fread(&data, 8, 1, input) 

試圖讀取一「項」與8個字節到緩衝區,並返回的項目數。 如果小於8個字節從當前位置到EOF左,則返回0。

一種可能的解決方案將是讀8項的1個字節,而不是:

ssize_t amount; 
while ((amount = fread(&data, 1, 8, input)) > 0) 
{ 
    fwrite(&data, 1, amount, output); 
} 

在while塊你然後可以檢查amount是否等於或小於8,爲您的 加密方法。

+0

我想過這個,但是,如果最後一個比特的位數少於一個字節呢?例如,是否有可能只有7位的文件? –

+0

@David天宇Wong:那是不可能的。文件是字節的集合。 –

+0

非常感謝!那麼在我之後添加你提供的代碼呢?我試過了,它不起作用,是不是輸入指針應該回到它可以讀取的最後一個地方? –