Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
Xaws

C Listar em UI

Recommended Posts

 Meu problema é o seguinte, eu tinha feito uma interface com um LISTBOX, adiciona os itens normal e eu tinha o seguinte problema, como fazer pra listar depois os itens?
 Então resolvi fazer o seguinte, pra cada item cadastrado ele cria seu próprio arquivo de texto, mais eu não sei como eu posso listar os arquivos já que não tem nome certo..
Aqui o código de quando adiciona o produto ao LISTBOX

					for(int k = 0; k < 1; k++)
					{
					TCHAR bufferItemField[FIELD_LENGTH];
					TCHAR bufferItemField2[FIELD_LENGTH];
					GetWindowText(gItemField, bufferItemField, FIELD_LENGTH);
					GetWindowText(gItemField2, bufferItemField2, FIELD_LENGTH);
					sprintf(filename, "ESTOQUE/%s.txt", bufferItemField); 
        				estoque = fopen(filename, "a+");
					SendMessage(gProductList, LB_ADDSTRING, 0, (LPARAM)bufferItemField);
					fprintf(estoque,"\n");
					fprintf(estoque,"PRODUTO: ");
					fprintf(estoque,bufferItemField);
					fprintf(estoque," PREÇO: ");
					fprintf(estoque,bufferItemField2);
					fclose(estoque);


 Agora como eu tentei fazer listar :atirador:

 

					estoque = fopen(filename, "r");
					char le[100000];
					//sprintf(filename, "ESTOQUE/%s.txt");
					while((fgets(le,100000,estoque) !=NULL))
					{
					SendMessage(gProductList, LB_ADDSTRING, 0, (LPARAM)le);
					SetWindowText(gProductList,le);
					fclose(estoque);

 Como faço pra ler os arquivos de texto que estão dentro da pasta ESTOQUE?

:atirador:

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você poderia criar um arquivo extra, um que fique na pasta raiz do programa ou do projeto, tal qual possui todas listas(arquivos) criadas, assim, você abre esse arquivo e vai ter todos os locais dos outros arquivos, só abrir eles depois... Exemplo: 

 

Temos a pasta da loja na pasta do programa.

Dentro da pasta loja tem o arquivo:

lista_de_arquivos.txt 

e a pasta produtos.

 

Dentro da pasta produtos tem todos arquivos dos produtos, como:

lapis.txt

caneta.txt

 

No arquivo lista_de_arquivos.txt vai estar assim:

./produtos/lapis.txt

./produtos/caneta.txt

 

 

Então quando seu programa ler o arquivo lista_de_arquivos.txt ela já vai saber onde foi criado um arquivo de produto.

 

Logo nos arquivos lapis e caneta, você pode por o nome, preço, etc...

 

Agora, para adivinhar um arquivo que está em estoque, é complicado, você poderia criar um índice/padrão para salvar os arquivos e abrir, como produto_1 / produto_2 / e assim vai, ai vai procurando a partir desse índice.

 

Espero ter ajudado :}

Editado por TYSQUARE89
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • @TYSQUARE89  valeu pelas ideias,essa ↓ não daria certo porque pretendo trabalhar com muitos itens

    No arquivo lista_de_arquivos.txt vai estar assim:
    ./produtos/lapis.txt
    ./produtos/caneta.txt


    Essa é a ideia que eu preciso ↓ , posso fazer um padrão,seria mais fácil mais como eu posso fazer ele procurar dessa forma? 

    Agora, para adivinhar um arquivo que está em estoque
    é complicado, você poderia criar um índice/padrão para salvar os arquivos e abrir
    como produto_1 / produto_2 / e assim vai, ai vai procurando a partir desse índice.

    Mesmo assim desde já obrigado pelas respostas :thumbsup::atirador:

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Para isso você só precisa fazer um teste para verificar se o arquivo já existe, usando uma função como essa: 

    //Retorna o índice existente
    //padrão do arquivo: arquivo.1.txt  arquivo.2.txt  etc
    //o parametro indi determina onde começar, supondo que você queira começar de arquivo.55.txt
    //use indice(55);
    int indice(int indi){
    
        FILE *f = NULL;
        char arquivo[20];
      
        indi = (indi > limite ? 0 : indi);
      
        for(; indi < limite; indi++){
             //monta caminho do arquivo
             sprintf(arquivo, "arquivo.%d.txt",indi);
             //se arquivo existe
             if((f = fopen(arquivo, "r") != NULL){
                fclose(f);
                break;
             }
        }
    
    //retorna indice encontrado
    return indi;
    }

    Depois que retorna o índice, é só você abrir o arquivo através dele ou com algumas mudanças no código acima, você pode procurar um que não existe...

     

    P.s: É só um código improvisado, mas a lógica para encontrar o arquivo através de um índice é assim, é claro que existe outras funções para fazer isso, como stat, acesss, etc., mas essa é uma visão mais clara de como fazer.

     

     

    Editado por TYSQUARE89
    • Curtir 2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @TYSQUARE89  Valeu, depois vou dar uma estudada e posto os resultados :thumbsup:

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @TYSQUARE89  Olha aí cara como tentei, mais não lista nada...Vê o que eu fiz de errado

     

    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
    int indice(int indi){
    int limite = 100;
        FILE *f = NULL;
        char arquivo[20];
      
        indi = (indi > limite ? 0 : indi);
      
        for(; indi < limite; indi++){
             //monta caminho do arquivo
             sprintf(arquivo, "xxx\\estoque_%0004s.txt",indi);
             //se arquivo existe
             if((f = fopen(arquivo, "r") != NULL)){
             char le[100];
             fread(le,1,100,f);
             printf("%s",le);
                fclose(f);
                break;
             }
        }
    return indi;
    }
    }

     

    1.png

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Bom dia, você não precisa usar int indice(...) dentro da função main, ja que ela sera usada na chamada dentro do escopo de main(), tente assim:

     

    #include <stdio.h>
    #include <stdlib.h>
      
    int indice(int indi){
    	int limite = 100;
        FILE *f = NULL;
        char arquivo[20];
      
        indi = (indi > limite ? 0 : indi);
      
        for(; indi < limite; indi++){
             //monta caminho do arquivo
             sprintf(arquivo, "xxx\\estoque_%d0004s.txt",indi);
             //se arquivo existe
             if((f = fopen(arquivo, "r") != NULL)){
             	char le[100];
             	fread(le,1,100,f);
            	printf("%s",le);
                fclose(f);
                break;
             }
        }
    return indi;
    }
    
    //Supondo que xxx\\estoque_10004s.txt ja exista
    main()
    {
      int i;
      
      printf("Digite um indice: ");
      scanf("%d",&i);
      
      i = indice(1);
      return 0;
    }


      
    Algo que eu percebi, é que ou ele busca todos índices ou ele vai direto no indicado no parâmetro da chamada indi, portanto se remover o for(indi;), ele não irá procurar outro índice, caso o indicado na chamada não exista, então se remover o for não precisa de return e a função pode ser void

    Editado por TYSQUARE89
    • Curtir 2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @TYSQUARE89  Ta mais ele não ta funcionando, eu queria que ele abrisse a pasta xxx e depois lesse todos os txt's que tem dentro da pasta (xxx) e então me mostrasse.
    Eu devia ter escrito dessa forma antes, da forma que eu escrevi lá em cima ficou confuso o que eu realmente queria :P

     

    :atirador:

    Editado por Xaws
    • Curtir 2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Pois é, eu não tinha compreendido muito bem, pensei que queria uma forma de memorizar os arquivos e depois abrir a partir de um padrão, mas se quiser abrir os arquivos sem saber nome nem nada, ainda existe uma forma:

    Exemplo meu:

    //Open source ;)
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <string.h>
    
    void abrir(const char *pasta, const char *arquivo){
       if(arquivo != NULL){
            //monta caminho
            char arq[100];
            sprintf(arq, "%s/%s",pasta,arquivo);
    
            //abrir
            FILE *f = fopen(arq, "r");
    
            //se arquivo existe
            if(f != NULL){
                    char le[100];
                    printf("\n\n");
                    while(!feof(f)){
                            if(fgets(le,100,f))
                                    printf("%s\n",le);
                    }
                    fclose(f);
             }
        }
    }
    
    void listar(const char *PASTA){
        DIR *dir;
        struct dirent *lsdir;
    
        dir = opendir(PASTA);
        while ( ( lsdir = readdir(dir) ) != NULL )
        {
            //verifica extensao .txt
            if(lsdir->d_name[strlen(lsdir->d_name)-3] == 't' &&
               lsdir->d_name[strlen(lsdir->d_name)-2] == 'x' &&
               lsdir->d_name[strlen(lsdir->d_name)-1] == 't'){
                    //abre o arquivo
                    abrir(PASTA,lsdir->d_name);
            }
        }
        closedir(dir);
    }
    
    //Supondo que a pasta ja exista
    main()
    {
      char pasta[100];
    
      printf("Digite o nome da pasta: ");
      scanf("%s",pasta);
    
      listar(pasta);
      return 0;
    }

    é só digitar o nome da pasta que a função listar, por razões obvias, lista os arquivos nessa pasta e depois encontra os que são .txt, e enfim envia para função abrir.

     

    P.S: se uma pasta se chamar blabla.txt ela sera aberta e vai dar um erro, então tente mantar apenas arquivos com o nome e extensão .txt

    • Curtir 1
    • Amei 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @TYSQUARE89  Obrigado, funcionou perfeitamente :lol:
     Agora vou estudar seu código pra compactar ele e jogar pro meu UI, brigadão :thumbsup:

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×