Ir ao conteúdo
  • Cadastre-se

C++ Ler arquivo TXT em C


david nilo

Posts recomendados

boa tarde galera do Clube do Hardware, sou novo aqui então me perdoem se eu fala algo errado.

bom vamos ao meu problema, tenho q fazer um código em linguagem c que leia um arquivo .txt, ate aqui tudo bem porém tenho q mostra o texto na tela e depois consulta uma linha especifica por um nome por exemplo: tem uma lista de produdos e seus repectivos codigos. nesse meu programa qro digitar o nome do produto e aparecer todas informações q contem nessa lista.txt..

void suspencao(void){
int cod;
    char url[]="lista.txt";
    char ch;
    FILE *arq;
    
    arq = fopen(url, "r");
        while( (ch=fgetc(arq))!= EOF )
        putchar(ch);        
    fclose(arq);
    printf("\n\ndigite codigo da peca\n");
    scanf("%d", &cod);
}

 

coloquei a lista num procedimento,mas acho q vou colocar depois numa struct. primeiro qro resolver esse probleminha de manipula o arquivo, agradeço desde já pela ajuda..

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

@david nilo Para encontrar determinado produto, seja, por nome, tipo, etc..., use fscanf, porém você precisa organiza-los quando for salvar, de forma que seja possível usar fscanf.

Portanto, na hora da leitura, basta usar fscanf e armazenar os dados em cada variável, de acordo com a estrutura de salvamento, ai utilize strncmp para comparar as variáveis, e assim você já terá as outras informações, obtidas pelo fscanf.

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

ainda n resolvi o meu problema, fiz uma pesquisa e consegui desenvolver esse codigo.

mas ele não sai do primeiro if..

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct produto{
    char peca[30];
    int codigo;
}cad;

int main(){
    FILE* arq;
    char pesquisa[100];
    int pos = 0, regnum = 0;
    char opc;
    
    if ((arq = fopen("lista.txt", "r+b")) == NULL);{
        printf(" houve um erro ao ler o arquivo!\n");
        system("pause");
        exit(1);
    }
    printf("Lista de produtos!\n\n");
    printf("Digite sua pesquisa:\n");
    gets(pesquisa);
    
    while(!feof(arq)){
        if (fread(&cad, sizeof(struct produto), 1, arq)==1){
            if(strcmp(cad.peca, pesquisa)== 0 || cad.codigo == atoi(pesquisa)){
                printf("\n\tpeca: %s\n\tcodigo: %d\n\n", cad.peca, cad.codigo);
                regnum = pos+1;
                break;
            }
        }
        pos++;
    }
    
    if (regnum ==0){
        printf("Desculpe! produto nao localizado");
    } else{
        printf("Deseja altera o registro?(s/n) ");
        scanf("%s", &opc);
        getchar();
        if (opc == 's'){
                printf("atualizar produto: \n\n");
                printf("\tpeca: ");
                gets(cad.peca);
                printf("\tcodigo: ");
                scanf("%d", &cad.codigo);
                printf("\n\n");
                getchar();
                
                fseek(arq, sizeof(struct produto)*(regnum-1), SEEK_SET);
                fwrite(&cad, sizeof(struct produto), 1, arq);
                printf("registro alterado com susseco! \n\n");
        }
        
    }
    fclose(arq);
    system("pause");
    return 0;    
}
 

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

@david nilo    seria melhor para trabalhar com os dados se você pegar o que está na lista e colocar em um struct , para isso precisa ver como os dados estão organizados na lista , ela poderia ser assim ;

produto    preço_compra   preço_venda   codigo      data
arroz          8,00           10,00       500     15/10/17     
feijao         3,00           4,00        501     12/10/17
carne          10,00          15,00       502     08/10/17
leite          1,00           2,00        503     09/10/17
outro          2,00           4,00        504     20/10/17

nessa lista os dados precisam estar separados por pelo menos um espaço, e então você coloca um struct  assim :

struct arquivo{
    char produto     [20];
    char preco_compra[30];
    char preco_venda [20];
    char codigo      [20];
    char data        [20];
  };
  struct arquivo dados[100000];

e coloca no struct assim :

fp =   fopen("c:/dados de consulta.txt","r");
if(fp==NULL){MessageBox(0,"erro no arquivo","",0);}
while( fscanf(fp,"%s",&dados[j].produto  ) != EOF && fscanf(fp,"%s",&dados[j].preco_compra  ) != EOF
    && fscanf(fp,"%s",&dados[j].preco_venda) != EOF && fscanf(fp,"%s",&dados[j].codigo) != EOF
    && fscanf(fp,"%s",&dados[j].data ) != EOF){
    j++;
}
fclose(fp);

aí então você pesquisa no struct normalmente e faz as modificações que quiser e depois quando terminar de fazer tudo você salva esse struct novamente no arquivo, seguindo neste mesmo formato .

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

bele meu amigo vou tenta aqui

adicionado 11 minutos depois

assim acho que fiz besteira porque assim sou novo em linguagem c, não consegui colocar essas informações que você passo,

add essa estruct  e substitui o 1 if e o while. e ficou pior.

você poderia me mostra como fazer essas alterações? 

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

@david nilo    aqui seu código com algumas modificações :

#include<stdio.h>
#include<locale.h>
#include<stdlib.h>
#include<string.h>
struct produto{
    char peca[30];
    int codigo;
}cad[100];
int main(){
    setlocale(LC_ALL,"");
    FILE* arq;
    char pesquisa[100];
    int pos = 0,j,i,regnum = 0;
    char opc;
    arq=fopen("lista2.txt","r");
    if(arq==NULL){
        printf(" houve um erro ao ler o arquivo!\n");
        system("pause");
        exit(1);
    }
    j=1;
    fscanf(arq,"%s",&cad[0].peca);fscanf(arq,"%s",&cad[0].peca);
    while( fscanf(arq,"%s",&cad[j].peca  ) != EOF && fscanf(arq,"%d",&cad[j].codigo  ) != EOF){
        j++;
    }
    fclose(arq);
    printf("Lista de produtos!\n\n");
    printf("Digite sua pesquisa:\n");
    gets(pesquisa);
    for(i=1;i<j;i++){
        if(strcmp(cad[i].peca,pesquisa)==0 || cad[i].codigo == atoi(pesquisa)){
            printf("\n\tpeça: %s\n\tcódigo %d\n\n",cad[i].peca,cad[i].codigo);
            regnum = pos+1;
            break;
        }
    }
    if (regnum ==0){
        printf("Desculpe! produto nao localizado\n");
    } else{
        printf("Deseja altera o registro?(S/N) ");
        scanf("%c", &opc);
        getchar();
        if (opc == 's'){
                printf("atualizar produto: \n\n");
                printf("\tpeca: ");
                gets(cad[i].peca);
                printf("\tcodigo: ");
                scanf("%d", &cad[i].codigo);
                printf("\n\n");
                getchar();

                remove("lista2.txt");
                arq=fopen("lista2.txt","w");
                fprintf(arq,"%s","produto");
                fprintf(arq,"%s","  ");
                fprintf(arq,"%s\n","codigo");
                for(i=1;i<j;i++){
                    fprintf(arq,"%s",cad[i].peca);
                    fprintf(arq,"%s\t"," ");
                    fprintf(arq,"%d",cad[i].codigo);
                    fprintf(arq,"%s\n"," ");
                }
                fclose(arq);
                /*fseek(arq, sizeof(struct produto)*(regnum-1), SEEK_SET);
                fwrite(&cad, sizeof(struct produto), 1, arq);*/
                printf("registro alterado com susseco! \n\n");
        }

    }
    /*fclose(arq);*/
    system("pause");
    return 0;
}

não entendi essa parte de fseek que você colocou para alterar o arquivo, ela parece não ter funcionado, creio que no lugar desse  fseek fwrite você precisaria colocar assim :

remove("lista2.txt");
arq=fopen("lista2.txt","w");
fprintf(arq,"%s","produto");
fprintf(arq,"%s","  ");
fprintf(arq,"%s\n","codigo");
for(i=1;i<j;i++){
    fprintf(arq,"%s",cad[i].peca);
    fprintf(arq,"%s\t"," ");
    fprintf(arq,"%d",cad[i].codigo);
    fprintf(arq,"%s\n"," ");
}
fclose(arq);

 

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