Compactador .txt de um diretorio

Iniciado por biriba_di, 17 de Novembro de 2011, 08:22

tópico anterior - próximo tópico

biriba_di


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:

#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);
}


biriba_di


fpissarra

#2
Citação de: biriba_di online 18 de Novembro de 2011, 19:39
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:

$ tar cvzf myfile.tar.gz diretório/*
[]s
Fred

Darcamo

#3
O corerto é
main(int argc, char *argv[])
e não
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


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

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
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.