Ir ao conteúdo
  • Cadastre-se
Asrety

C RESOLVIDO Como ler dados corretamente de um arquivo

Recommended Posts

Bom dia a todos, ultimamente tive um desafio que até hoje não consegui resolver, que é salvar dados em um txt, e ler, isso sem utilizar binário, então minha pergunta é, teria como ler esses dados utilizando somente um fscanf como na tentativa que fiz? sei que pode parecer algo simples, mas não consigo realizar essa tarefa, já consegui fazer isso utilizando strtok só que ficou muito grande o código, então queria somente com fscanf, pois facilitaria muito, Abaixo vou deixar o código.

 

ESCRITA

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{

    char nome[50];
    int idade;
    float dinheiro;

}Pessoa;

int main(){

    FILE *f1 = fopen("pessoa.txt", "w");
    Pessoa p;

    if(f1 == NULL){
        perror("Nao Foi Possivel Escrever");
        exit(0);
    }

    strcpy(p.nome, "Pedro Silva");
    p.idade = 18;
    p.dinheiro = 500.44;

    fprintf(f1, "%s,%d,%f\n", p.nome, p.idade, p.dinheiro);

    fclose(f1);

    return 0;
}

LEITURA

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{

    char nome[50];
    int idade;
    float dinheiro;

}Pessoa;

int main(){

    FILE *f1 = fopen("pessoa.txt", "r");
    Pessoa p;

    if(f1 == NULL){
        perror("Nao Foi Possivel Ler");
        exit(0);
    }

    fscanf(f1, "%s,%d,%f\n", p.nome, &p.idade, &p.dinheiro);


    printf("\nNome: %s", p.nome);
    printf("\nIdade: %d", p.idade);
    printf("\nDinheiro: %.2f", p.dinheiro);

    fclose(f1);

    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
52 minutos atrás, CiroboyBR disse:

use o fgets para ler as strings, o fscanf() não lê os espaços.

Não é bem assim, quero dizer fscanf ler qualquer coisa, basta usar o string de formatação da maneira certa. Complementado para ler caracteres com espaços use a seguinte string básica "%[^\n]" com esse formato a função cancela o input apenas quando o caractere ENTER for encontrado no fluxo. Os dados são salvos em um sequência de tipos char.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CiroboyBR, acredito que o fgets não vai me ajudar muito, pois a minha intenção é ler dados separados, com fgets ela le tudo até achar um '\n' e salva numa string, mas agradeço mesmo assim.

@AnsiC testei desse jeito, e aconteceu o que tu disse, leu todas as informações e salvou na variavel nome, e as variaveis idade e dinheiro como esperado ficou com lixo, você acha que não há como realizar essa separação somente com fscanf? ja vi uns códigos que utilizam somente números e lê certo, acredito o problema é ter q ler essa string nome.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
16 minutos atrás, Asrety disse:

acredito que o fgets não vai me ajudar muito, pois a minha intenção é ler dados separados, com fgets ela le tudo até achar um '\n' e salva numa string, mas agradeço mesmo assim.

Não acredite, tire a prova.

 

17 minutos atrás, Asrety disse:

testei desse jeito, e aconteceu o que tu disse, leu todas as informações e salvou na variavel nome

Mostre o código.

 

18 minutos atrás, Asrety disse:

você acha que não há como realizar essa separação somente com fscanf?

Como o companheiro relatou acima, tem como usar a formatação para ler o '\n', usando "%[^\n]" ao invés de "%s".

 

19 minutos atrás, Asrety disse:

acredito o problema é ter q ler essa string nome

Foi o que eu disse, pra usar o fgets para ler "as strings".

Compartilhar este post


Link para o post
Compartilhar em outros sites
16 minutos atrás, CiroboyBR disse:

Não acredite, tire a prova.

 

Sim eu testei, veja nessa print http://prntscr.com/ljim9c

 

16 minutos atrás, CiroboyBR disse:

Mostre o código.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{

    char nome[50];
    int idade;
    float dinheiro;

}Pessoa;

int main(){

    FILE *f1 = fopen("pessoa.txt", "r");
    Pessoa p;

    if(f1 == NULL){
        perror("Nao Foi Possivel Ler");
        exit(0);
    }

    fscanf(f1, "%[^\n],%d,%f\n", p.nome, &p.idade, &p.dinheiro);


    printf("\nNome: %s", p.nome);
    printf("\nIdade: %d", p.idade);
    printf("\nDinheiro: %.2f", p.dinheiro);

    fclose(f1);

    return 0;
}

 So alterei o %s para %[^\n], com o %s so tava lendo até "Pedro"

 

16 minutos atrás, CiroboyBR disse:

Foi o que eu disse, pra usar o fgets para ler "as strings".

 

Entendo, mas o fgets considera tudo como string, e essa é minha dificuldade, ler string, int, float tudo separado

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza. vamos por partes agora. É obrigatório você salvar o arquivo separando os dados com vírgula?

fprintf(f1, "%s,%d,%f\n", p.nome, p.idade, p.dinheiro);


Nesse caso você tem dados separados por vírgula, o fscanf lê dados intervalados por espaço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

7 minutos atrás, CiroboyBR disse:

beleza. vamos por partes agora. É obrigatório você salvar o arquivo separando os dados com vírgula?

 

Sim, infelizmente é um requisito do trabalho que estou fazendo.

 

7 minutos atrás, CiroboyBR disse:

Nesse caso você tem dados separados por vírgula, o fscanf lê dados intervalados por espaço.

 

Então fscanf para meu caso não é viável ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nesse caso você precisa ler s string toda e formatar a string (Quebra-la em partes, dividir e extrair as informações para outras inteiros etc).

Rode o código abaixo na mesma pasta do arquivo TXT

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){

    FILE *f1 = fopen("pessoa.txt", "r");

    char str[500];

    if(f1 == NULL){
        perror("Nao Foi Possivel Ler");
        exit(0);
    }

    fgets(str, 500, f1);

    for (int i = 0; str[i] != 0; i++ ) {
        if(str[i] == ',') {

            printf("\nAchei um dado: ");
        } else {
            printf("%c", str[i]);
        }
    }

    fclose(f1);

    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, minha duvida era essa mesmo, realmente vou ter q ler toda linha e ir separando com ja imaginava, ainda tinha esperanças com o fscanf kk, obrigado pela ajuda @CiroboyBR & @AnsiC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pera lá! Como disse antes fscanf lé até encontrar um ENTER, basta modificar o flag para virgula, assim ôh: "%[^,]" 

  • Curtir 2
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
19 minutos atrás, AnsiC disse:

Pera lá! Como disse antes fscanf lé até encontrar um ENTER, basta modificar o flag para virgula, assim ôh: "%[^,]" 

 

Funcionou @AnsiC, com certeza salvou o meu código, não sabia dessa, Muito Obrigado!

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual compilador vocês estão utilizando? Salvaram o arquivo como .c ou .cpp?

Já tentei de diversas formas usando o gcc e esse [^caractere] não funciona para delimitar a leitura.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CiroboyBR Como faz muito tempo não sei ao certo, mas baixei por esse link https://sourceforge.net/projects/mingw-w64/ utilizo esse ai junto com a ide codeblocks, mas fiz o teste aqui e até compilando pelo terminal não gera erros, e salvei o arquivo como .c

 

O Código do arquivo c que estou compilando: 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{

    char nome[50];
    int idade;
    float dinheiro;

}Pessoa;

int main(){

    FILE *f1 = fopen("pessoa.txt", "r");
    Pessoa p;

    if(f1 == NULL){
        perror("Nao Foi Possivel Ler");
        exit(0);
    }

    fscanf(f1, "%[^,],%d,%f\n", p.nome, &p.idade, &p.dinheiro);


    printf("\nNome: %s", p.nome);
    printf("\nIdade: %d", p.idade);
    printf("\nDinheiro: %.2f", p.dinheiro);

    fclose(f1);

    return 0;
}

Resultado:

 

Screenshot_1.png.9f5e1b67b4e946ceaf0409be373e8f5e.png

  • Curtir 2

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

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

×