paulo1205
(usa Ubuntu)
Enviado em 09/03/2017 - 10:35h
matheusgf1539 escreveu:
Bom dia pessoal estou com muita dificuldade, pra fazer um trabalho escolar, possuo um projeto pra fazer em C#
C#? O programa que você mostrou é em C, não C#.
Nesta comunidade do VoL, o foco é C e C++, não C#. Deve haver outras sobre Mono e C#, onde talvez você consiga ajuda mais específica sobre C#.
Como o programa mostrado tem cara de C, vou continuar respondendo como se C fosse.
ue tenha como função copiar um arquivo de uma maquina pra outra via Socket, conseguir fazer esse programa para copiar localmente, com a utilização de um laço while. porém quando eu passo os dados lidos para outra maquina encontro o problema que o arquivo sai corropido. gostaria de saber outra forma de copiar todo o meu arquivo sem o uso de um laço de repetição se é que é possivel.
meu codigo
void main(){
Aqui há um erro. O tipo de retorno de
main () tem de ser void.
Também a lista de argumentos de
main () pode ter um problema. Se você estiver usando C++, tudo bem usar desse jeito. Mas se for C, então você tem de dizer que a função não recebe argumentos através da palavra-chave
void presente entre os parênteses pois, ao contrário do C++ (e Java, e C#), uma lista de argumentos vazia em C significa que a função poderá ser chamada com qualquer quantidade de argumentos de quaisquer tipos.
FILE* origem = fopen("/home/matheus/Imagens/img.png","rb");
FILE* destino = fopen("/home/matheus/Documentos/img.png", "wb");
Eu sou um ardoroso defensor de testar o sucesso de qualquer operação de entrada e saída, principalmente no caso da obtenção inicial dos descritores ou ponteiros de arquivos ou streams.
Eu mudaria o código acima para algo como o seguinte.
FILE *origem, *destino;
if(!(origem=fopen("/home/matheus/images/img.png", "rb"))){
perror("Não pude abrir arquivo de leitura");
return 1;
}
if(!(destino=fopen("/home/matheus/images/Documents/img.png", "rb"))){
perror("Não pude abrir arquivo de saída");
return 1;
}
unsigned char B64; // Variavel de 64 bits
while(!feof(origem)) {
fread (&B64, sizeof(unsigned char), 1, origem);
fwrite(&B64, sizeof(unsigned char ), 1, destino);
}
Todo o laço de repetição também não está do meu agrado, e com erro.
A função
feof () só retorna verdadeiro
depois de uma operação de leitura exceder a quantidade de dados presente na fonte. Como você está lendo um caráter de cada vez, esse “depois de exceder” só vai acontecer depois que você mandar ler um byte e receber uma sinalização da função dizendo que só pôde ser zero bytes. Só que você despreza essa sinalização, pois não testa o valor de retorno da função.
Em tempo: se for para ler caráter a caráter, por que não usar simplesmente
fgetc (), em lugar de
fread ()? Se for para usar
fread (), seria melhor ler blocos de caracteres de uma vez só, para diminuir a quantidade total de chamadas a função.
Eis como eu reimplementaria todo o bloco acima.
char buffer[4096];
size_t nread;
/* É seguro usar ‘1’ abaixo porque sizeof(char) é 1 por definição. */
while((nread=fread(buffer, 1, sizeof buffer, origem))>0)
if(fwrite(buffer, 1, nread, destino)<nread){
perror("Erro de gravacao");
return 1;
}
if(ferror(origem)){
perror("Erro de leitura");
return 1;
}
fclose(origem);
fclose(destino);
Também a chamada a
fclose () pode falhar, particularmente aquela do stream de saída. Assim sendo, ela deveria testada.
if(fclose(destino)!=0){
perror("Erro de gravacao");
return 1;
}