Copia binaria em c

Ola estou tentando criar um programa que copia os bits de uma uma imagem png , e recria-la com outro nome, segue o algoritimo.alguem pode me ajudar ?, ate cria o arquivo porem não abre.

desde já grato.

#include<stdlib.h>
#include<stdio.h>
void main(int argc, char **argv){

FILE* origem; //                          abre arquivo binario para leitura
FILE* destino;//                          cria arquivo binario para leitura escrita 

unsigned long long B64 = 0; //            Variavel de 64 bits

if (( origem = fopen(argv[1], "rb")) == NULL) {
    printf("\n\nNao foi possivel abrir o arquivo para leitura binaria.\n");
    exit(0);
  } 
if (( destino = fopen(argv[2], "w+b")) == NULL) {
    printf("Nao foi possivel criar o arquivo para escrita e leitura binaria.\n");
    exit(0);
  }



 while(!feof(origem)) {

 fread (&B64, sizeof(unsigned long long), 1, origem);
 fwrite(&B64, sizeof(unsigned long long), 1, destino);

}

fclose(origem);
fclose(destino);
printf("\nOK!\n");}

O ideal é você usar um array com 64 bytes.
Além disso, você deve testar o retorno do fread para ver o número de bytes retornados (nem todo arquivo terá um número de bytes multiplo de 64);

como o Vini falou, nem todo tamanho é multiplo de 64, os que não forem, seu retorno será 0, imprime ele para fazer o teste

O código abaizo usa um buffer de 10 MB para poder copiar rapidamente arquivos grandes. Como você deve ter visto, copiar 8 bytes de cada vez é extremamente lento…

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

#define BUFFER_SIZE (10 * 1024 * 1024)
/// <summary>Copies a file into another file</summary>
/// <returns>0 = OK, 1 = problem opening input file, 2 = problem opening output file</returns>
int copyFile (const char *inputFileName, const char *outputFileName) 
{
    FILE *inputFile = fopen (inputFileName, "rb");
	FILE *outputFile = fopen (outputFileName, "w+b");
	char *buffer = malloc (BUFFER_SIZE);
	int nBytesRead;
	if (inputFile == NULL)
	    return 1;
	if (outputFile == NULL)
		return 2;
	while ((nBytesRead = fread (buffer, 1, BUFFER_SIZE, inputFile)) > 0) 
	{
		fwrite (buffer, 1, nBytesRead, outputFile);
	}
	fclose (outputFile);
	fclose (inputFile);
	free (buffer);
	return 0;
}

int main (int argc, char *argv[]) 
{
    copyFile (argv[1], argv[2]);
}

Normalmente eu nunca uso feof (não acho essa função nem um pouco confiável.). É questão de costume.
O seu equivalente em Java (available) é outra função que não é confiável.

O hábito de algumas pessoas usarem feof deve-se ao fato que isso é o jeito de se fazer as coisas em Pascal (Delphi) :

WHILE NOT EOF (F) DO BEGIN
    ...

Não copie os hábitos de outras linguagens :slight_smile: