Fórum Ubuntu Linux - PT
21 de Maio de 2013, 11:25 *
Olá, Visitante. Faça o login ou registre-se.
Perdeu o seu e-mail de ativação?

Login com nome de usuário, senha e duração da sessão
Notícias: Atenção usuários de email com anti-spam (Uol e Bol).
 
   Home   Ajuda Regras Pesquisa Login Registre-se  
Anúncios
Páginas: [1]   Ir para o fundo
  Imprimir  
Autor Tópico: Compactador .txt de um diretorio  (Lida 715 vezes)
biriba_di
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 7


Ver Perfil
« em: 17 de Novembro de 2011, 08:22 »


Pessoal, bom dia!

Localizei esse codigo que é um compactador de .txt, ele pede o diretorio, e assim q vc coloca ele compacta todos .txt que tiverem na pasta.
Porém quando eu tento compilar ele no GCC ele ta dando o seguinte erro:
14 C:\Users\limadie\Documents\LpI\C++\compacta.cpp cannot convert `char**' to `const char*' for argument `1' to `int strcmp(const char*, const char*)'
33 C:\Users\limadie\Documents\LpI\C++\compacta.cpp cannot convert `char**' to `const char*' for argument `2' to `char* strcat(char*, const char*)'
43 C:\Users\limadie\Documents\LpI\C++\compacta.cpp invalid conversion from `char' to `char*'
43 C:\Users\limadie\Documents\LpI\C++\compacta.cpp initializing argument 1 of `char* strcat(char*, const char*)'
43 C:\Users\limadie\Documents\LpI\C++\compacta.cpp invalid conversion from `char' to `const char*'
43 C:\Users\limadie\Documents\LpI\C++\compacta.cpp initializing argument 2 of `char* strcat(char*, const char*)'

To quebrando a cabeça aqui, mas mexo em uma coisa, da erro em outra.. se conseguirem localizar o erro e me sinalizar!

Obrigado!!
Segue o codigo:

Código:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
/*
 
Este programa compacta todos arquivos txt existentes em um determinado diretorio
 
*/
 
int main(int *argc, char **argv[]){
        FILE *fp;
        char arquivo_temp[60], comando[80],arquivo_tar[60],arquivo[60];
        if (strcmp(argv[1],"--h") == 0){
                printf("##########################\n\n");
                puts("Programa para compactar arquivos txt...");
                printf("\n");
                puts("Sintaxe: ");
                printf("\n");
                puts("  #./compacta <DIRETORIO>");
                printf("\n\n");
                puts("Exemplo:");
                printf("\n");
                puts("#./compacta /tmp");
                printf("\n");
                puts("**compacta todos arquivos txt existentes em /tmp");
                printf("\n#########################\n");
                exit(0);
        }
        int i;
 
        char lista[80]="ls ";
        strcat(lista,argv[1]);
        strcat(lista,"/*.txt");
        strcat(lista," > lista");
        system(lista);
        fp = fopen("lista","r");
        while(!feof(fp)){
                /*fgets(string,60,fp)*/
 
                fscanf(fp,"%s",arquivo_temp);
                for(i=0;i<strlen(arquivo_temp)-4;i++)
                        strcat(arquivo[i],arquivo[i]);
 
                printf("\n\n%s\n\n",arquivo);
 
 
                /*criando o pacote tar*/
 
                /*comando = 'tar -cf' arquivo_tar  arquivo */
 
                strcpy(comando,"tar -cf ");
                strcpy(arquivo_tar,arquivo);
                strcat(arquivo_tar,".tar");
                strcat(comando,arquivo_tar);
                strcat(comando," ");
                strcat(comando,arquivo);
                system(comando);
 
                strcpy(comando,"");
 
                /*criando o pacote bz2*/
                strcpy(comando,"bzip2 -z ");
                strcat(comando,arquivo_tar);
                system(comando);
        }
                system("rm *.txt -rf");
                system("rm *.tar -rf");
        fclose(fp);
}
Registrado
biriba_di
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 7


Ver Perfil
« Responder #1 em: 18 de Novembro de 2011, 19:39 »

Ngm pode me ajudar? ;/
Registrado
fpissarra
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 246



Ver Perfil WWW
« Responder #2 em: 18 de Novembro de 2011, 21:49 »

Ngm pode me ajudar? ;/
Dois motivos pelos quais seu "compactador" não funcionará:

1. Ele não 'compacta';
2. Você está tentando usar código feito para linux no Windows...

É mais fácil usar (no linux) o 'tar' diretamente:

Código:
$ tar cvzf myfile.tar.gz diretório/*
[]s
Fred
« Última modificação: 18 de Novembro de 2011, 21:51 por fpissarra » Registrado
Darcamo
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 1.289


Ver Perfil
« Responder #3 em: 19 de Novembro de 2011, 00:03 »

O corerto é
Código:
main(int argc, char *argv[])
e não
Código:
main(int *argc, char **argv[])

A variável argc indica quantos argumentos foram passados para o programa (armazenados em argv). Se o usuário chamar o programa sem passar nada então argc será igual a 1 (o primeiro argumento é sempre o nome do programa). É bom fazer um teste para sair do programa nesse caso. Por exemplo, defina a função abaixo

Código:
void printUsage()
{
    printf("##########################\n\n");
    puts("Programa para compactar arquivos txt...");
    printf("\n");
    puts("Sintaxe: ");
    printf("\n");
    puts("  #./compacta <DIRETORIO>");
    printf("\n\n");
    puts("Exemplo:");
    printf("\n");
    puts("#./compacta /tmp");
    printf("\n");
    puts("**compacta todos arquivos txt existentes em /tmp");
    printf("\n#########################\n");
}

Assim você pode substituir o seu if por
Código:
if (argc < 2)
{
    printUsage();
    return 0;
}
if (strcmp(argv[1],"--h") == 0)
{
    printUsage();
    return 0;
}

Note que também substituí o exit(0) por return 0, mas isso é mais um costume meu. Se você não fizer essa proteção checando o argc então o programa vai dar "Falha de Segmentação" na linha
Código:
if (strcmp(argv[1],"--h") == 0)
ao tentar acessar argv[1] (hargv[1] não possui nada então seu programa acaba tentando ler uma posição inválida de memória e o programa da falha de segmentação).

Não olhei muito o restante do programa para dizer como é o certo (sou ruim em C), mas tenha cuidado com as funções strcpy e strcat. Como strings em C são apenas vetores de char então você está efetuando cópia direta de uma região de memória em outra e não possui nenhuma proteção contra erros. É fácil tentar copiar algo onde não deve (por exemplo quando a variável de destino não tem capacidade de receber tudo que você tenta copiar).

ps: Como o fpissarra disse esse programa não compacta. O que ele tenta fazer é gerar o comando para compactar usando o programa tar e então executa o comando no shell do linux com a função system.
« Última modificação: 19 de Novembro de 2011, 00:09 por Darcamo » Registrado
Páginas: [1]   Ir para o topo
  Imprimir  
 
Ir para:  

Powered by MySQL Powered by PHP Tema desenvolvido por FaBMak e n3t0
Powered by SMF 1.1.18 | SMF © 2006-2009, Simple Machines
© 2013 Canonical Ltd. Ubuntu e Canonical são marcas registradas da Canonical Ltd.
XHTML 1.0 válido! CSS válido!