Ir ao conteúdo
  • Cadastre-se

C Listar em UI


Xaws
Ir à solução Resolvido por 1freakday,

Posts recomendados

 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
Link para o comentário
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 :}

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
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.

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
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

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@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:

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Solução

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
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...