Ir ao conteúdo
  • Cadastre-se

C Como ler dados corretamente de um arquivo


Asrety
Ir à solução Resolvido por Ansi C,

Posts recomendados

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

 

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

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

 

 

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

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

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

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

 

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