Ir ao conteúdo

C Listar em UI


Ir à solução Resolvido por 1freakday,

Posts recomendados

Postado

 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
Postado

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
Postado

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

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
Postado

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

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
Postado

@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
  • Solução
Postado

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

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!