Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ulfreitas

[Resolvido] Manipulação de Arquivo

Recommended Posts

Boa tarde

Comecei a ver sobre Arquivos, (abrir, manipular, fechar); to com um exercicio pra treinar só que não entendi direito como funciona pra acrescentar dados ou exibir a partir de um arquivo.

 

Faça um programa para criar um arquivo chamado Alunos.dat

Aqui tranquilo

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

int main()
{
  FILE *arq;

  if(arq = fopen("Alunos.dat","w") == NULL)
  {
     printf("Mensagem de Erro tal tal\n");
     exit(0);
  }

  printf("Arquivo criado com sucesso!!!\n");
  fclose(arq);

  return 0;
}

 

cont. Inclua alunos nesse arquivo, deve ter (numero,aluno,curso,nota)

eu posso usar um struct aluno com todos esses dados, mas como eu coloco no arquivo?

 

outra coisa que raios é argc e argv[] pra que serve isso???

int main(int argc, char *argv[]).

 

Agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Argc e argv são argumentos da função main que recebem dados da linha de comando (quando você inicia o programa compilado).

Argc é um inteiro e indica a quantidade de argumentos passados. Argv é um char ** e contém os argumentos passados p/ o programa.

 

O exercício pede algum formato p/ separar as informações de um aluno?

 

 

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

typedef struct st_aluno {
   	unsigned int numero;
   	char * nome;
   	char * curso;
   	float nota;
} aluno;

int main()
{
  FILE *arq = fopen("Alunos.dat", "w");

  if(arq == NULL)
  {
 	printf("Mensagem de Erro tal tal\n");
 	exit(0);
  }

  printf("Arquivo criado com sucesso!!!\n");
  aluno novo;
  novo.numero = 1234;
  novo.nome = "João Roberto";
  novo.curso = "Administração";
  novo.nota = 3.45F;

  puts("Gravando informações do aluno...");
  fprintf(arq, "%d,%s,%s,%.2f\n", novo.numero, novo.nome, novo.curso, novo.nota);
  fclose(arq);

  return 0;
}

Sugestões p/ o código:

 

1- Separe a atribuição da comparação. Fica mais legível.

2- Quando a operação puder dar errado devido a diversas causas, não se incomode em ficar procurando condições a serem verificadas e mensagens a serem exibidas. O padrão C "define" uma biblioteca chamada errno.h que "se integra com o sistema" (por falta de expressão melhor). Nos casos mais básicos você só precisa incluir o errno.h e verificar se a variável errno for definida. Exemplo com o mesmo código postado:

 

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

typedef struct st_aluno {
   	unsigned int numero;
   	char * nome;
   	char * curso;
   	float nota;
} aluno;

int main()
{
  FILE *arq = fopen("Alunos.dat", "w");

  if(errno)
  {
 	printf("%m");
 	exit(0);
  }

  printf("Arquivo criado com sucesso!!!\n");
  aluno novo;
  novo.numero = 1234;
  novo.nome = "João Roberto";
  novo.curso = "Administração";
  novo.nota = 3.45F;

  puts("Gravando informações do aluno...");
  fprintf(arq, "%d,%s,%s,%.2f\n", novo.numero, novo.nome, novo.curso, novo.nota);
  fclose(arq);
  return 0;
}

 

A vantagem é que o sistema é o responsável pela "geração" da mensagem de erro. você só tem que imprimir na tela. Veja alguns casos de erro da função fopen em Manpage fopen

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia

Obrigado pela resposta Isis (você é essa da foto? que linda :love: )

 

Argc e argv são argumentos da função main que recebem dados da linha de comando (quando você inicia o programa compilado).

Que dados seriam esses? eu li que o primeiro argumento (0) é o nome do programa, mas e esses outros dados quais são?

 

O exercício pede algum formato p/ separar as informações de um aluno?

Pede nada.

 

  printf("Arquivo criado com sucesso!!!\n");
  aluno novo;
  novo.numero = 1234;
  novo.nome = "João Roberto";
  novo.curso = "Administração";
  novo.nota = 3.45F;

  puts("Gravando informações do aluno...");
  fprintf(arq, "%d,%s,%s,%.2f\n", novo.numero, novo.nome, novo.curso, novo.nota);
  fclose(arq);

Ah entendi eu pego os dados normal e depois passo o valor das variáveis com a funçao fprintf().

E se eu tiver um for()?

seria:

 

  for(i=0;i<5;i++)
  {
    printf("Arquivo criado com sucesso!!!\n");
    aluno novo;
    novo[i].numero = 1234;
    novo[i].nome = "João Roberto";
    novo[i].curso = "Administração";
    novo[i].nota = 3.45F;

    puts("Gravando informações do aluno...");
    fprintf(arq, "%d,%s,%s,%.2f\n", novo[i].numero, novo[i].nome, novo[i].curso, novo[i].nota);
    fclose(arq);
  }

Não tem perigo de sobrescrever os dados no arquivo?

 

Sugestões p/ o código:

1- Separe a atribuição da comparação. Fica mais legível.

2- Quando a operação puder dar errado devido a diversas causas, não se incomode em ficar procurando condições a serem verificadas e mensagens a serem exibidas. O padrão C "define" uma biblioteca chamada errno.h que "se integra com o sistema" (por falta de expressão melhor). Nos casos mais básicos você só precisa incluir o errno.h e verificar se a variável errno for definida. Exemplo com o mesmo código postado:

1- Ok farei isso da próxima vez

2- vou dar uma olhada nessa biblioteca <errno.h>.

 

Mais uma dúvida, e para ler os dados desse arquivo?

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oh fiz com um for(), deu certo fica tudo salvo no arquivo. Porém quando termina o laço o programa encerra de uma vez, nem mostra o ultimo printf, pq isso acontece?

 

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

struct cadastro{
       unsigned int numero;
       char nome[30];
       char curso[30];
       float nota;
   };

int main()
{
   int i;
   cadastro aluno[3];
   FILE *arq = fopen("MatriculaAluno.dat","w");

   if(errno)
   {
       printf("%m");
       exit(0);
   }

   printf("Arquivo criado com sucesso!!!\n");
   printf("\n");

   printf("Cadastro de alunos:\n");
   for(i=0;i<3;i++)
   {
       printf("Digite o numero do aluno\n");
       scanf("%d%*c",&aluno[i].numero);
       printf("Digite o nome do aluno\n");
       gets(aluno[i].nome);
       printf("Digite o curso do aluno\n");
       gets(aluno[i].curso);
       printf("Digite nota do aluno\n");
       scanf("%f",&aluno[i].nota);
       printf("---------------------------\n");

       fprintf(arq,"%d, %s, %s, %.2f\n",aluno[i].numero, aluno[i].nome, aluno[i].curso, aluno[i].nota);
   }

   printf("Dados cadastrados com sucesso!!!\nTecle ENTER para sair\n");
   fclose(arq);
   return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O core deve ter sido corrompido.

 

Normalmente isso acontece quando você passa do final da array, é o caso mais comum. Mas não parece o caso.

 

Depois se eu tiver tempo dou uma olhada melhor... um debugger ajuda muito nisso ^^

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

O core deve ter sido corrompido.

 

Normalmente isso acontece quando você passa do final da array, é o caso mais comum. Mas não parece o caso.

 

Depois se eu tiver tempo dou uma olhada melhor... um debugger ajuda muito nisso ^^

 

 

 

Abraços :D

Aow renato você tá bom?

Cara desculpa a ignorancia, mas quem é esse core?

 

Procurei no google mas só achei:

processador core;

cores;

até core draw :huh:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descobri o erro, eu usei scanf("%f",&taltal) nao limpei o buffer da funçao, e eu fiz esse código no dev-C++ nele tem q colocar uma função pra parar a tela quando chega no final normalmente uso scanf("%*c");

Eu usei o dev-C pq aqui nao tem outro, mas vou instalar, sério nao uso mais dev-C (valeu Renato por me apresentar o Code::Block :thumbsup: )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Core dumped, superficialmente e resumidamente é um erro que acontece quando dá algum problema na execução do seu programa. O Linux para a execução e acusa essa mensagem. No windows dá uma mensagem de 'parou de funcionar'.

 

 

Bom que resolveu então, ignorei que poderia ser o buffer ^^

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.