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