Ir ao conteúdo

Posts recomendados

Postado

Como transformar arquivo bin em txt?

 

#include <stdio.h>// utilizada para arquivos FILE
#include <stdlib.h>
#include <math.h>

main(void)
{
   FILE *ARQ;
   int i,a[6];
   ARQ=fopen("matriz.bin","wb"); // wb se existe o arquivo ele cria novamente
   i=0;
   while (i<=5) {
      printf(" Digite o %d elemento : ",i+1);
      fflush(stdin);
      scanf("%d",&a[i]); 
      a[i]= pow(a[i] ,2);
      i++;
   }
   fwrite(a,sizeof(a),1,ARQ); // grava no arquivo de uma so vez a matriz
   fclose(ARQ);
   system("pause");
}

 

Postado

A diferença é o conceito de linhas. O arquivo gravado como binário tem registros de tamanho fixo, que pode ser 1 ;) . Então alguém gravou isso lá em algum formato e você precisa saber. Se gravou 6 int que tem 4 bytes cada um... já tem seu número.

 

Seu programa sequer abriu um outro arquivo...

  • Curtir 1
Postado

@fac.loboAntes de qualquer coisa precisa ter um arquivo "binário" para ler e depois gravar em formato texto...

E devia ter vindo junto com o enunciado. Imagino que você só tenha tentado escrever essa primeira parte.

 

Vou deixar um exemplo que

  • cria um arquivo binário com 9 inteiros a partir de zero e
  • mostra na tela os valores separados por ','
  • cria um arquivo texto de uma linha com os valores, separados também por ','.

 

É simples e não tem nem 20 linhas. Espero que ajude a entender

 

Antes disso, de volta ao seu programa:

 

Umas sugestões

 

  • Evite esse tipo de comentário:
    #include <stdio.h>// utilizada para arquivos FILE

    Comente o que você está fazendo e porque. É bem conhecido o uso de cada header. Não ajuda muito escrever isso
     

  • main() retorna int. Declare como tal
     

  • Sobre essa construção
     

       FILE *ARQ;
       int i,a[6];
       ARQ=fopen("matriz.bin","wb"); // wb se existe o arquivo ele cria novamente
       i=0;
       while (i<=5) { //...


    Não escreva assim. Nunca declare variáveis globais à função com nomes ingênuos como i e entenda que se quer gravar 6 valores com os primeiros 6 quadrados é muito mais natural usar um comando for para isso e nunca while().
     

  • O quadrado de x é a mesma coisa que x*x. Não precisa incluir math.h e chamar pow() para uma coisa dessas.
     

  • E declare o arquivo e abra na mesma linha.
     

  • Se é um arquivo que vai abrir de novo depois se defenda e use uma variável com o nome dele, porque se você mudar o nome em um lugar e esquecer de mudar em outro seu programa já era. Faça o simples.
     

  • Entenda que não há razão para ler esses valores do teclado e enroscar você mesmo em frente a tela para digitar números e enter TODA vez que for testar o progra,a. Não acrescenta nada. Nunca escreva programas interativos. É chato e não vai aprender nada. Se o programa precisa ser interativo você coloca isso depois.
     

  • teste o retorno de scanf(). É o simples. Que adiante seguir se não ler nada?
     

  • não use fflush() na entrada. Não faz sentido e apenas indica que o programa foi mal construído
     

  • nunca use system(). É proibido em toda parte e não vai aprender nada usando isso, que é apenas passar uma string para o sistema com um suposto comando
     

  • use nomes mais expressivos: se sabe que vai usar dois arquivos porque chama um de ARQ?

Compare com esse exemplo:
 

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

int main(void)
{
   const char* nome_bin = "matriz.bin"; 
   FILE *binario = fopen( nome_bin,"wb");
   int      a[6] = {0};
   for (int i=0; i<=5; i+=1 )
   {
        printf(" Digite o %d elemento : ",i+1);
        int res = scanf("%d",&a[i]); 
        if ( res != 1 ) return -1;
        a[i]= pow(a[i] ,2);
   }
   fwrite(a,sizeof(a),1,binario); 
   fclose(binario);
}

 

Em resumo seu programa não está nada bom. Mas minha opinião não vale nota e não importa ;) 

 

O Exemplo afinal:

 

O exemplo vai criar um arquivo binário com 9 int de 0 a 8 inclusive. Então vai 36 bytes. Depois vai abrir o arquivo e gravar um arquivo texto com os valores em uma linha
 

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        09/07/2021     13:27             36 amatriz.bin
-a----        09/07/2021     13:27             25 amatriz.txt

 

Acima a listagem dos arquivos. É melhor saber antes o que esperar ;) então 36 bytes está ok: 4x9

 

Abaixo os 36 bytes de amatriz.bin

 

image.png.3bb3340eb71bc472cbf0faa3499e5525.png

 

Em hexadecimal, claro. O último valor deve ser 8 e são 4 bytes para cada int. Então está certo. Se usa arquivos binários se acostume a conferir com um dump como esse. 

 

Em amatriz.txt, sem novidades, a linha com os valores separados por vírgula
 

image.png.b7a910b4c211f2ef57524e204286543e.png

 

Eis o código

 

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

int main(void)
{
    const char* a_bin = "amatriz.bin";
    const char* a_txt = "amatriz.txt";
    // cria o arquivo em modo binario
    FILE*  binario = fopen(a_bin,"wb");
    for ( int i = 0; i<9; i+=1 ) fwrite( &i, sizeof(i), 1, binario );
    fclose(binario);

    // abre o arquivo, le os valores e 
    // grava numa linha no arquivo texto
    // separados por virgula e com um '\n'
    // no fim da linha
    binario = fopen( a_bin,"r");
    FILE*   texto = fopen(a_txt,"w");
    int valor = 0;

    // o primeiro valor e diferente porque e para
    // separar por virgula...
    if ( fread( &valor, sizeof(valor), 1, binario ) <= 0 )
    {
        printf("Erro na leitura: arquivo %s vazio?\n", a_bin);
        return -1;
    }
    fprintf( texto, "%d", valor );
    printf("Valores: %d", valor );

    // trata o resto dos valores
    while( fread( &valor, sizeof(valor), 1, binario ) > 0 )
    {   // leu mais alguma coisa
        fprintf( texto, ", %d", valor );
        printf(", %d", valor );
    }
    fclose(binario);
    printf("\n");

    return 0;
}

 

Que mostra na tela

clube> gcc -o tst -Wall binfile.c
clube> ./tst
Valores: 0, 1, 2, 3, 4, 5, 6, 7, 8
clube> 

 

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