Ir para conteúdo
Fórum Script Brasil
  • 0

Criar um arquivo binário com dados de um vetor


Éder winkert

Pergunta

Bom dia,

Sou novo no fórum e iniciante em C e preciso da ajuda de vocês.

Tenho que criar um arquivo binário contendo um vetor de N elementos compostos por 0 e 1. fiz o programa abaixo, mas da erro no final, o codeblock que eu uso não aponta erro, mas não gera esse binário.

Desde já agradeço

 

#define      L     1024                                 /* linear lattice size */
#define  ofile     "ZProhibited.10"           /* output binary file name */

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int main()
{
int                 N=L*L, prohibited[N], i;
FILE              *fdata;
for(i=0 ; i<=3L ; i++)
        {
          prohibited=0;
        }
for(i>3L ; i<=3L+11 ; i++)
        {
          prohibited=1;
        }
for(i>3L+11 ; i<=4L ; i++)
        {
          prohibited=0;
        }
for(i>4L ; i<=4L+11 ; i++)
        {
          prohibited=1;
        }
for(i>4L+11 ; i<N ; i++)
        {
          prohibited=0;
        }
fdata=fopen(ofile,"wb");
fwrite(prohibited, 4, N,fdata);
fclose(fdata);
}

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Para postar códigos use a tag CODE apertando o botão <> no topo do campo de respostas, assim você preserva a formatação do código e evita que o fórum faça alterações nele.

Por exemplo, o fórum "comeu" todos os [ i ] (sem espaços) do seu código pois no fórum isso é a tag para deixar o texto em itálico, então o texto do seu código está em itálico a partir do primeiro que foi encontrado (os demais apenas somem porque o texto já tá em itálico).

 

Mas já posso ver alguns erros no programa, onde você está colocando comparações no primeiro parâmetro dos ciclos for, como i>4L, imagino que queria colocar i = 4L+1?

E talvez seria melhor fazer um único ciclo for com alguns ifs dentro...

Editado por isrnick
Link para o comentário
Compartilhar em outros sites

  • 0

Valeu ISRNICK, vou colocar novamente aqui.

#define      L     1024                       /* linear lattice size */
#define  ofile     "ZProhibited.10"           /* output binary file name */

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

int main()
{
int                 N=L*L, prohibited[N], i;
FILE              *fdata;
for(i=0 ; i<3L+1 ; i++)
        {
          prohibited[i]=0;
        }
for(i=3L+1 ; i<3L+12 ; i++)
        {
          prohibited[i]=1;
        }
for(i=3L+12 ; i<4L+1 ; i++)
        {
          prohibited[i]=0;
        }
for(i=4L+1 ; i<4L+12 ; i++)
        {
          prohibited[i]=1;
        }
for(i=4L+12 ; i<N ; i++)
        {
          prohibited[i]=0;
        }
fdata=fopen(ofile,"wb");
fwrite(prohibited, sizeof(int), N,fdata);
fclose(fdata);
}

 

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, o problema é que o comprimento do array/vetor é muito grande, ou seja quando você faz prohibited[N], com N tendo valor de mais de 1 milhão, está tentando reservar espaço demais no stack da memória para armazenar os valores, e isso causa o erro.

Nesse caso é necessário alocar memória dinamicamente, usando malloc() (da biblioteca stdlib.h), a fim de guardar os valores no heap da memória, onde grandes quantidades de dados podem ser armazenados:

#define      L     1024                       /* linear lattice size */
#define  ofile     "ZProhibited.10"           /* output binary file name */

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

int main()
{
    int N=L*L, *prohibited, i;
    FILE *fdata;
    prohibited = malloc(N * sizeof(*prohibited));
    for(i=0 ; i<3L+1 ; i++)
    {
        prohibited[i]=0;
    }
    for(i=3L+1 ; i<3L+12 ; i++)
    {
        prohibited[i]=1;
    }
    for(i=3L+12 ; i<4L+1 ; i++)
    {
        prohibited[i]=0;
    }
    for(i=4L+1 ; i<4L+12 ; i++)
    {
        prohibited[i]=1;
    }
    for(i=4L+12 ; i<N ; i++)
    {
        prohibited[i]=0;
    }
    fdata=fopen(ofile,"wb");
    fwrite(prohibited, sizeof(int), N,fdata);
    fclose(fdata);
    free(prohibited);
    return 0;
}

OBS: Lembre-se que é necessário usar free() para liberar a memória alocada dinamicamente.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...