Ir ao conteúdo

Posts recomendados

Postado

Boa tarde, preciso de ajuda

 

Estou tentando ler um arquivo .dat, aparentemente eles está sendo aberto, passa nos testes, e fecha corretamente. Só que não estou conseguindo imprimir o conteúdo do arquivo.

 

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

typedef struct {
    int codMensagem;
    int indice;
    char letra[200];
}tLetra;

int main(void){
    FILE *fp;
    tLetra letra[10];
    int q, i;


    fp = fopen("mensagens(1).dat", "wb");
    if (fp == NULL) { //verificar se conseguiu abrir
        printf("arquvio n abriu");
        return 1;
    }else

    while(1){
            i++;
        q = fread(&letra, sizeof(letra), 1, fp);

        if (feof(fp) || ferror(fp)){
            break;
        }

    }

    fprintf(fp,"%d %d %s", letra[1].codMensagem, letra[1].indice, letra[1].letra);
    if(fclose(fp)== 0){
        printf("Arquvio aberto com sucesso");
    }

    return 0;
}
 

  • Curtir 1
Postado

Use como parâmetro do fopen a string "r" e troque a linha do fread por:

 

 

q = fscanf(fp, "%d %d %s", &letra[1].codMensagem, &letra[1].indice, &letra[1].letra);

 

 

Com isso, para imprimir as linhas basta direcionar o fprintf para stdout em vez de fp.

 

 

 

Espero ter ajudado GbhmuXl.gif.

  • Curtir 1
Postado

@Leanderson Pinheiro    eh isso mesmo que o  @rjjj   disse ,    para ler um arquivo binario voce usa o comado fopen = ("nome_do_arquivo","rb");

e o fread coloca os dados no typedef    struct , sendo que nesse caso  precisa estar em um loop , pois a cada passo do loop os dados sao inseridos em uma posicao do vetor da struct  ,  e em seguida fecha o arquivo com fclose , e abre novamente com "wb"  para gravar em arquivo , e depois de gravar feche o arquivo com fclose para que haja a validacao dos dados gravados .

Postado

@Leanderson Pinheiro    e esse código poderia ser assim :

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

typedef struct 
{
    int  codMensagem;
    int  indice     ;
    char letra[200] ;
}            tLetra ;
int main(void) 
{
    FILE* fp;
    tLetra letra[10];
    int q, j,i=0,ax=0;

    letra[0].codMensagem = 5;
    letra[0].indice = 11;
    strcpy(letra[0].letra, "qualquer coisa");

    fp = fopen("mensagens(1).dat", "rb");
    if (fp == NULL)             //verificar se conseguiu abrir
    {
        printf("arquvio não abriu\n");
        //return 1;
    }
    else
    //while (fread(&letra, sizeof(letra), 1, fp) /*1*/)
    {
        while (fread(&letra[i], sizeof(tLetra), 1, fp) == 1)
        {
            printf("%d\n", letra[i].codMensagem);
            printf("%d\n", letra[i].indice);
            printf("%s\n", letra[i].letra);
            i++;
            /*q = fread(&letra, sizeof(letra), 1, fp);
            if (feof(fp) || ferror(fp))
            {
                break;
            }*/
        }
        fclose(fp);
        ax = 1;
    }
    if( ! ax )i = 1;
    fp = fopen("mensagens(1).dat", "wb");
    for (j = 0; j < i; j++)
    {
        //fprintf(fp, "%d \n%d \n%s n", letra[1].codMensagem, letra[1].indice, letra[1].letra);
        fwrite(&letra[j] , sizeof(tLetra), 1, fp);
    }
    fclose(fp);
    if (fclose(fp) == 0) {
        printf("Arquvio aberto com sucesso");
    }

    return 0;
}

 

  • Curtir 1
Postado
6 horas atrás, Leanderson Pinheiro disse:

FILE *fp;
    tLetra letra[10];
    int q, i;


    fp = fopen("mensagens(1).dat", "wb");
    if (fp == NULL) { //verificar se conseguiu abri

 

Não use parenteses no nome do arquivo. É pedir por problemas.

 

6 horas atrás, Leanderson Pinheiro disse:

  while(1){
            i++;
        q = fread(&letra, sizeof(letra), 1, fp);

        if (feof(fp) || ferror(fp)){
            break;
        }

    }

    fprintf(fp,"%d %d %s", letra[1].codMensagem, letra[1].indice, letra[1].letra);

 

Se vai apenas ler e imprimir porque declarou 10??

 

E a primeira é zero e não 1. Está lendo na primeira e mostrado a segunda, então não é surpresa que não tenha nada lá.

 

Se não foi você que gravou o arquivo pode não ter lá dentro o que você imagina. Ao usar esse tio de arquivo se acostume a usar um dump, ou abrir o arquivo em um editor hecadecimal.

 

Pode ser algo como o od do linux, ou algo do IDE mesmo. muitos tem essa função.

 

image.png.764826a0f863baa21ad639cef670f7d4.png

 

Veja esse acima, em geral são 16 bytes por linha. do lado direito em ASCII à esquerda em hecadecimal

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!