2015-12-18 3 views
1

У меня есть несколько двоичных файлов, которые я хочу записать в выходной файл. Итак, я написал эту функцию, используя char в качестве буфера, наивно думая, что это сработает.Как написать один двоичный файл другому в c

//Opened hOutput for writing, hInput for reading 

void faddf(FILE* hOutput, FILE* hInput) { 
    char c; 
    int scan; 
    do{ 
     scan = fscanf(hInput, "%c", &c); 
     if (scan > 0) 
      fprintf(hOutput, "%c", c); 
    } while (scan > 0 && !feof(hInput)); 
} 

Выполнение этой функции дает мне выход из немногих читаемых char-й в начале двоичного файла. Так что я попытался это так:

void faddf(FILE* hOutput, FILE* hInput) { 
    void * buffer; 
    int scan; 
    buffer = malloc(sizeof(short) * 209000000); 
    fread(buffer, sizeof(short), 209000000, hInput); 
    fwrite(buffer, sizeof(short), 209000000, hOutput); 
    free(buffer); 
} 

Этот «работает», но работает только тогда, когда файл меньше, чем мой «магическое число» Есть ли лучший способ?

+3

Возможный дубликат [копировать содержимое двоичного файла] (http://stackoverflow.com/questions/2757832/copying-the-contents-of-a-binary-file) –

+2

Чтение «символов» из двоичного файла является видом оксюморона. Вместо этого прочитайте * bytes * или еще лучше прочитайте * куски * байтов. И почему вы ожидаете, что бинарный файл будет доступен для чтения? –

+3

Вы читаете «hOutput». – user3386109

ответ

1

Хотя ваш новый код (в the answer) гораздо лучше, чем старый код, он может все еще совершенствоваться и упрощаться.

В частности, вы можете избежать любых проблем с памятью, скопировав файл в куски.

void faddf(FILE *fpout, FILE *fpin) 
{ 
    char buffer[4096]; 
    size_t count; 

    while ((count = fread(buffer, 1, sizeof buffer, fpin)) > 0) 
     fwrite(buffer, 1, count, fpout); 
} 
1

Вам следует избегать чтения байт на байт. Используйте fgets() функцию вместо fscanf().

Пожалуйста, обратитесь к: Man fgets() (for Windows)

При открытии обоих файлов рядом друг с другом (один вход/выход один), вы говорите, что выходной файл содержит только читаемых символов. .. Но может ли ваш текстовый редактор отображать нечитаемые символы на входном?

+2

Тем не менее, чтение «строк» ​​из двоичного файла является таким же оксюмороном, как чтение «символов». Вместо этого я предложил бы использовать 'fread' и' fwrite'. –

+0

О да, это была функция, которую я искал. Я не мог вспомнить, что это имя. Ты прав. – FrenchFalcon

+0

Данные, которые я читаю, к сожалению, имеют плохое строковое представление, так как оно имеет символы с низким значением, смешанные с читаемыми символами: 0x00 - 0xff – haelmic

1

Я не должен был задан вопрос, в первую очередь, но вот как я в конечном итоге делает это:

void faddf(FILE* hOutput, FILE* hInput) { 
    void * buffer; 
    int scan,size; 
    size_t read; 

    //get the input file size 
    fseek(hInput, 0L, SEEK_END); 
    size = ftell(hInput); 
    fseek(hInput, 0L, SEEK_SET); 

    //place the get space 
    buffer = malloc(size); 
    if (buffer == NULL)exit(1);//should fail silently instead 

    //try to read everything to buffer 
    read = fread(buffer, 1, size, hInput); 

    //write what was read 
    fwrite(buffer, 1, read, hOutput); 

    //clean up 
    free(buffer); 
} 
Смежные вопросы