2014-02-08 3 views
0

У меня есть этот супер простой код, где я читаю блоки из 8 байтов (я буду их шифровать позже в коде), а затем записываю их в новый файл.Чтение и запись 64 бит по 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 байт остались от текущей позиции до конца файла, она возвращает 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

@ Давид 天宇 Вонг: Это невозможно. Файл представляет собой набор байтов. –

+0

Большое спасибо за это! Также как насчет добавления кода, который вы предоставили после того, как я это сделал? Я пробовал, и это не сработало, разве указатель ввода не должен возвращаться к последнему месту, которое он мог бы прочитать? –