ulfreitas 6 Denunciar post Postado Fevereiro 22, 2012 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
_Isis_ 202 Denunciar post Postado Fevereiro 22, 2012 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
ulfreitas 6 Denunciar post Postado Fevereiro 23, 2012 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
ulfreitas 6 Denunciar post Postado Fevereiro 23, 2012 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
Renato Utsch 24 Denunciar post Postado Fevereiro 23, 2012 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
ulfreitas 6 Denunciar post Postado Fevereiro 24, 2012 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
ulfreitas 6 Denunciar post Postado Fevereiro 24, 2012 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
Renato Utsch 24 Denunciar post Postado Fevereiro 24, 2012 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