Arquivos [RESOLVIDO]

1. Arquivos [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 05/04/2008 - 14:31h

Galera,

To com um problema aqui que já não sei mais como resolver. Eu to tentando fazer tipo uma função cat.
Com arquivos txt, c, etc ela funciona, mas com arquivos jpg, binarios e afins não.
O codigo é esse:

// mcat.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

int main (int argc, char **argv)
{
FILE *fp;
register int i = 0;
char *file;
struct stat file_attr;

// Checa argumentos da funçao main()
if (argc < 2)
{
printf("Uso: %s <arquivo>\n", argv[0]);
return 0;
}

// Abre o arquivo como 'binario para leitura'
fp = fopen(argv[1], "rb+");

if (!fp)
{
perror("[*] fopen");
return 0;
}

// stat(file)
if (stat(argv[1], &file_attr) == -1)
{
perror("[*] stat()");
return 0;
}

printf("File size (bytes): %d\n", file_attr.st_size);
// Aloca memoria para file
file = (char*) malloc (file_attr.st_size * sizeof (char));
if (!file)
{
perror("[*] malloc()");
return 0;
}

// Executa leitura do arquivo

while(1)
{
if (feof(fp)) break;
fscanf(fp, "%c", &file[i]);
i++;
}

printf("strlen(file - bytes): %d\n", strlen(file));
for (i = 0; i < strlen(file); i++)
printf("%c", file[i]);
free(file);
return 0;
}





  


2. MELHOR RESPOSTA

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 08/04/2008 - 09:28h

FORMA ERRADA:
for (i = 0; i < strlen(file); i++)
printf("%c", file[i]);

O strlen vai retornar o tamanho da string file. Só que o tamanho é até onde ele encontrar um byte zero. Arquivo binário tem vários bytes em zero!

FORMA CORRETA:
for (i = 0; i < file_attr.st_size; i++)
printf("%c", file[i]);

Porque file_attr.st_size tem a quantidade de bytes que fora armazenado em file.

Agora eu só não entendi porque tanto trabalho para fazer algo simples:

#include <stdio.h>

int main(int argc, char **argv)
{
FILE *fp;
char p;

// Checa argumentos da funçao main()
if (argc < 2) {
printf("Uso: %s <arquivo>\n", argv[0]);
return 0;
}

if (!(fp = fopen(argv[1], "rb"))) {
perror("[*] fopen");
return 0;
}
/* apenas r! Porque r+? e o b só tem sentido em DOS */

p = fgetc(fp);
while (!feof(fp)) {
printf("%c", p);
p = fgetc(fp);
}
fclose(fp);
}


Porque agora não tem malloc (pra que isto? correndo o risco de não ter memória?)

3. Re: Arquivos [RESOLVIDO]

Fábio Felix Dias
slack felix

(usa Slackware)

Enviado em 05/04/2008 - 22:50h

Saudações,

Eu testei o código que você postou e funcionou, pelo menos acho que sim, não sei se é o resultado que você está querendo. Fiz o seguinte teste:

bash-3.1$ ./main lua.jpg
File size (bytes): 29331
strlen(file - bytes): 4
ÿØÿàbash-3.1$






4. Re: Arquivos [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 06/04/2008 - 19:14h

Veja que tu não pode jogar binários na tela. Vai sair LIXO, teu shell pode abortar, bipar, explodir, várias coisas.


5. Re: Arquivos [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 07/04/2008 - 22:41h

@slack felix

não cara, ele tinha que na segunda linha, mostrar o mesmo valor da primeira, e imprimir todo o arquivo,

@elgio

isso que o programa atualmente tah fazendo, mais muito mal. o shell num dá biziu nenhum, a intenção é fazer uma automação:

$ cat /home/user/img.jpg > ./img.jpg

mais não tah funcionando. por algum motivo o programa tah abortando o loop de leitura do arquivo nos primeiros 10 bytes de qualquer arquivo nao-texto.

Se algume souber como arrumar isso...

Valeu pela ajuda galera,
[]'s


6. Re: Arquivos [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 08/04/2008 - 09:16h

for (i = 0; i < strlen(file); i++)
printf("%c", file[i]);

strlen pega tamanho de STRING.
Só que o que tem em file NÃO É UMA STRING!!!


7. Re: Arquivos [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 08/04/2008 - 12:44h

Porra velho,

Valeu cara,
Tá veno... eu nem atinei pra isso... isso que dá programar durante muito tempo sem pausas :D kkkkk

Valeu,
[]'s






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts