Asskiller 4 Denunciar post Postado Junho 10, 2013 /* Devido ao alto índice de violência que tem acontecido no Rio de Janeiro, e visando melhorar a sua estratégia de trabalho, uma empresa de segurança faz constantemente um levantamento de casos de violência registrados diariamente. Esta empresa armazena em um arquivo binário as informações de todos os tipos de violência registrados. Cada registro deste arquivo é composto pelos seguintes campos: Código do tipo de violência (inteiro) Descrição da violência (string de 100 posições) Número de casos ocorridos (inteiro) a) Faça uma função chamada le_casos(), que deve ler os dados do arquivo b) Faça uma função chamada busca_casos(), para realizar a busca de um código de tipo de violência no arquivo e exibir na tela o total de violências ocorridas deste tipo c) Faça uma função grava_casos(), que gera o arquivo d) Gerar um segundo arquivo com a situação atual na cidade considerando existir, no máximo, 10 diferentes tipos de códigos. Neste arquivo, serão gravados o código com a respectiva totalização de cada um Fazer chamada as funções criadas.*/ #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <ctype.h> using namespace System; void menu(); void lecasos(); void grava(); struct Case{ int violencia; char violenciadr[100]; int casos; }criador; FILE *fp; // 1 arquivo FILE *fp2; // letra d 2 arquivo int violencia; int casos; char violenciadr[100]; int select; int main(array<System::String ^> ^args) { menu(); switch(select){ case 1: lecasos(); break; case 2: break; case 3: grava(); break; case 4: printf("Saindo...\n"); exit; break; default: printf("Opacao Invalida - Utilize o Menu"); menu(); }while(select != 4); system("pause"); return 0; } void menu(){ printf("|------------------------------------------------|\n"); printf("| 1 - Ler Casos |\n"); printf("| 2 - Buscar Casos |\n"); printf("| 3 - Gravar Casos |\n"); printf("| 4 - Sair |\n"); printf("|------------------------------------------------|\n"); printf("Entre com a Opcao :\n"); scanf("%d",&select); } void grava(){ fp = fopen("casos.bin","wb"); if(!fp){ puts("Erro ao criar o arquivo"); exit(0); } puts("Insira o Numero do Codigo para o Caso:"); scanf("%d",&criador.casos); while(criador.casos !=0){ puts("Digite o codigo para o tipo da violencia:"); scanf("%d",&criador.violencia); puts("Digite a descricao da violencia:"); scanf("%s",&criador.violenciadr); criador.violenciadr[100]=toupper(criador.violenciadr[100]); fflush(stdin); fwrite(&criador,sizeof(struct Case),1,fp); puts("Digite o numero de casos diferente de 0:"); scanf("%d",&criador.casos); if(criador.casos ==0){ system("cls"); menu(); } } fclose(fp); } void lecasos(){ int i; fp = fopen("casos.bin","rb"); if(!fp){ puts("Erro ao criar o arquivo"); exit(0); } fread(&criador,sizeof(struct Case),1,fp); printf("Exibir Dados:\n"); while(!feof(fp)){ for(i=0; i < criador.casos;i++){ // tentei iniciar um loop para mostrar tudo , porem deu erro..... como eu mostro esse bloco de informaçoes para o usuario ? violencia = criador.violencia; casos=criador.casos; violenciadr[100] = criador.violenciadr[100]; fread(&criador,sizeof(struct Case),1,fp); printf("Violencias: %d Codigos : %d Descrição das Violencias:%s",violencia,casos,violenciadr); } } fclose(fp); } Meu problema esta na funcao lecasos , alguem pode me orientar na questao de como e inicializado o loop e uma devida explicacao , se e correto utilizar o fread para eu ler os casos que foram inseridos na funcao acima dela.Desde ja Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
GBecker 51 Denunciar post Postado Junho 10, 2013 Essa atribuição de string está incorreta: violenciadr[100] = criador.violenciadr[100]; Para copiar strings em C deve utilizar alguma função da biblioteca padrão ou manipular ponteiros. Como: strcpy, memcpy, ... http://www.cplusplus.com/reference/cstring/strcpy/?kw=strcpy http://www.cplusplus.com/reference/cstring/memcpy/?kw=memcpy Espere ter ajudado, FLW! Compartilhar este post Link para o post Compartilhar em outros sites
Asskiller 4 Denunciar post Postado Junho 10, 2013 memcpy(&criador.violenciadr[100],&violenciadr[100],sizeof(violenciadr[100])); Beleza , vlw pelo toque , agora irei ver o resto , se tiver algo a mais que possa ajudar. Agradeço @Edit Acontece que quando , eu tento ler o arquivo , acusa erro no Visual Studio , Tentativa de leitura ou gravacao em memoria protegida. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Junho 11, 2013 Não use fflush na entrada padrão. Isso é comportamento específico e não é garantido que funcionará em outro ambiente. Compartilhar este post Link para o post Compartilhar em outros sites
Asskiller 4 Denunciar post Postado Junho 11, 2013 /* Devido ao alto índice de violência que tem acontecido no Rio de Janeiro, e visando melhorar a sua estratégia de trabalho, uma empresa de segurança faz constantemente um levantamento de casos de violência registrados diariamente. Esta empresa armazena em um arquivo binário as informações de todos os tipos de violência registrados. Cada registro deste arquivo é composto pelos seguintes campos: Código do tipo de violência (inteiro) Descrição da violência (string de 100 posições) Número de casos ocorridos (inteiro) a) Faça uma função chamada le_casos(), que deve ler os dados do arquivo b) Faça uma função chamada busca_casos(), para realizar a busca de um código de tipo de violência no arquivo e exibir na tela o total de violências ocorridas deste tipo c) Faça uma função grava_casos(), que gera o arquivo d) Gerar um segundo arquivo com a situação atual na cidade considerando existir, no máximo, 10 diferentes tipos de códigos. Neste arquivo, serão gravados o código com a respectiva totalização de cada um Fazer chamada as funções criadas.*/ #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> using namespace System; void menu(); void lecasos(); void grava(); void busca(); void gerar2arquivo(); struct Case{ int violencia; char violenciadr[100]; int casos; }criador; FILE *fp; // 1 arquivo FILE *fp2; // letra d 2 arquivo int violencia; int casos; char violenciadr[100]; int select; int main(array<System::String ^> ^args) { menu(); switch(select){ case 1: grava(); break; case 2: busca(); break; case 3: lecasos(); break; case 4: gerar2arquivo(); break; case 5: printf("Saindo...\n"); exit(0); break; default: printf("Opacao Invalida - Utilize o Menu"); menu(); }while(select != 5); system("pause"); return 0; } //Quando eu escolho uma opcao , exemplo : 1 ao sair da opcao selecionada e voltar para o menu... o programa trava // ao escolher uma nova opcao ex: 2 void menu(){ system("cls"); printf("|------------------------------------------------|\n"); printf("| 1 - Gravar Casos |\n"); printf("| 2 - Buscar Casos |\n"); printf("| 3 - Ler Casos |\n"); printf("| 4 - Situacao Atual da Cidade - Gerar |\n"); printf("| 5 - Sair |\n"); printf("|------------------------------------------------|\n"); printf("Entre com a Opcao :\n"); scanf("%d",&select); } void grava(){ fp = fopen("casos.bin","wb"); if(!fp){ puts("Erro ao criar o arquivo"); exit(0); } puts("Insira o Numero do Codigo para o Caso:"); scanf("%d",&criador.casos); while(criador.casos !=0){ puts("Digite o codigo para o tipo da violencia:"); scanf("%d",&criador.violencia); puts("Digite a descricao da violencia:"); scanf("%s",&criador.violenciadr); criador.violenciadr[100]=toupper(criador.violenciadr[100]); fflush(stdin); // sem isto corrompe o teclado... fwrite(&criador,sizeof(struct Case),1,fp); puts("Digite o numero de casos diferente de 0:"); scanf("%d",&criador.casos); if(criador.casos == 0){ menu(); } } fclose(fp); } // a busca esta sendo feita , porem nao esta imprimindo os dados requisitados // voce insere o tipo de violencia e ele retorna um numero de caso diferente do pedido void busca(){ int i; int voltar; fp = fopen("casos.bin","r+"); if(!fp){ puts("Erro ao criar o arquivo"); exit(0); } do{ printf("Digite o codigo para o tipo da violencia:\n"); scanf("%d",&criador.violencia); while(!feof(fp)){ fread(&criador,sizeof(struct Case),1,fp); casos = criador.casos; // esta imprimindo a estrutura toda digitada , inves de visualiza apenas os casos. printf("\nNumero de Casos para essa violencia: %d",casos); } fclose(fp); puts("\nDeseja retornar ao Menu? - Sim=1 Nao=0"); scanf("%d",&voltar); if(voltar == 1) menu(); }while(voltar != 1); } // Nao esta exibiindo corretamente os dados do tipo de violencia inserido.... // nao consegui exibit a descricao das violencias void lecasos(){ int i; fp = fopen("casos.bin","r+"); if(!fp){ puts("Erro ao criar o arquivo"); exit(0); } do{ printf("Exibir qual tipo de Violencia? Insira o Codigo:\n"); scanf("%d",&criador.violencia); fread(&criador,sizeof(struct Case),1,fp); while(!feof(fp)){ violencia = criador.violencia; casos = criador.casos; fread(&criador,sizeof(struct Case),1,fp); printf("Tipo da Violencia: %d \nCasos : %d\n",violencia,casos); } fclose(fp); puts("\nDeseja retornar ao Menu? - Sim=1 Nao=0"); scanf("%d",&voltar); if(voltar == 1) menu(); }while(voltar != 1); } // estou fazendo ainda.... void gerar2arquivo(){ fp = fopen("casos.bin","r+"); if(!fp){ puts("Erro ao criar o arquivo"); exit(0); } fp2 = fopen("casos.bin","wb"); if(!fp2){ puts("Erro ao criar o arquivo"); exit(0); } } Dei uma mechida , segue alguns problemas que estou tendo. Compartilhar este post Link para o post Compartilhar em outros sites
reebr 94 Denunciar post Postado Junho 11, 2013 Quando você for abrir o arquivo para gravar dados não é preciso fazer tratamento para verificar se o mesmo existe, basta fazer a abertura com "a". fopen("random.bin","ab"); Assim você também não perderá os dados já gravados. struct caso { int codigoViolencia; int numeroCasos; char descViolencia [100]; }; int gravacaso (void) { struct caso _caso; int opt; FILE * fpcaso; printf ("Digite o codigo da violencia ou 0 p/ sair: "); if( (sscanf ((char*)opt, "%i")) != 0 ) { _caso.codigoViolencia = opt; printf("Descricao da Violencia: "); fgets(_caso.descViolencia, 100, stdin); printf("Numero de Casos:" ); sscanf((char*)_caso.numeroCasos, "%i"); fpcaso = fopen ("casos.bin", "ab"); fwrite (&_caso, sizeof(_caso), 1, fpcaso); fclose (fpcaso); return 0; } } int lecaso (void) { struct caso _caso; FILE * fpcaso; fpcaso = fopen ("casos.bin", "rb"); if (!fpcaso) return 1; else while (fread (&_caso, sizeof(_caso), 1, fpcaso)) printf("\nCodigo: %i\nDescricao: %s\nNumero de casos: %i\n", _caso.codigoViolencia, _caso.descViolencia, _caso.numeroCasos); return 0; }; int buscarcaso (void) { int opt = 0; int flag = 0; printf ("Digite o codigo da violencia ou 0 p/ sair: "); if( (sscanf ((char*)opt, "%i")) != 0 ) { struct caso _caso; FILE *fpcaso; fpcaso = fopen("casos.bin", "rb"); if(!fpcaso) return 1; else { while ((!flag) && (fread (&_caso, sizeof(_caso), 1, fpcaso) == 1)) if(_caso.codigoViolencia == opt) { printf("\nOcorreram %i casos deste tipo.\n", _caso.numeroCasos); flag = 1; } } if (!flag) return -1; else return 0; } }; Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Junho 12, 2013 fflush(stdin); // sem isto corrompe o teclado... O teclado não corrompe. O que acontece é um \n ficar na entrada. Existe pelo menos 2 formas de evitar isso sem recorrer a um comportamento que, pelo padrão da linguagem, é indefinido. O Neelix já comentou isso após um post seu em outro tópico. http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/ Compartilhar este post Link para o post Compartilhar em outros sites
Asskiller 4 Denunciar post Postado Junho 12, 2013 Isis , estarei dando uma lida e verificando... Obrigado Neelix , estarei testando adptei seu codigo e gostaria de tirar algumas duvidas.1 - Porque voce nao utiliza FILE *fp; , como variavel global ?O resto das perguntas estao no corpo do codigo. Estou tendo erro justamente no sscanf struct Case{ int violencia; char violenciadr[100]; int casos; }criador; FILE *fp; // 1 arquivo FILE *fp2; // letra d 2 arquivo int violencia; int casos; char violenciadr[100]; int select; int main(array<System::String ^> ^args) { menu(); switch(select){ case 1: grava(); break; case 2: busca(); break; case 3: lecaso(); break; case 4: gerar2arquivo(); break; case 5: printf("Saindo...\n"); exit(0); break; default: printf("Opacao Invalida - Utilize o Menu"); menu(); }while(select != 5); system("pause"); return 0; } //Quando eu escolho uma opcao , exemplo : 1 ao sair da opcao selecionada e voltar para o menu... o programa trava // ao escolher uma nova opcao ex: 2 void menu(){ system("cls"); printf("|------------------------------------------------|\n"); printf("| 1 - Gravar Casos |\n"); printf("| 2 - Buscar Casos |\n"); printf("| 3 - Ler Casos |\n"); printf("| 4 - Situacao Atual da Cidade - Gerar |\n"); printf("| 5 - Sair |\n"); printf("|------------------------------------------------|\n"); printf("Entre com a Opcao :\n"); scanf("%d",&select); } int grava(void){ int opt; printf ("Digite o codigo da violencia ou 0 p/ sair: "); if( (sscanf ((char*)opt, "%i")) != 0 ) // poderia me explica esse %i e porque voce define um ponteiro char* antes de opt ? //Seria o parametro de sscanf ? { criador.violencia = opt; printf("Descricao da Violencia: "); fgets(criador.violenciadr, 100, stdin); printf("Numero de Casos:" ); sscanf((char*)criador.casos, "%i"); fp = fopen("casos.bin","ab"); // Porque voce inicializa o arquivo apenas aqui antes do fwrite ? fwrite (&criador, sizeof(Case), 1, fp); fclose (fp); return 0; } } int busca(void) { int opt = 0; int flag = 0; printf ("Digite o codigo da violencia ou 0 p/ sair: "); if( (sscanf ((char*)opt, "%i")) != 0 ) { fp = fopen("casos.bin", "rb"); if(!fp) return 1; else { while ((!flag) && (fread (&criador, sizeof(Case), 1, fp) == 1)) // poderia me explicar essa laço ? if(criador.violencia == opt) { printf("\nOcorreram %i casos deste tipo.\n", criador.casos); flag = 1; } } if (!flag) return -1; else return 0; } }; int lecaso (void) { fp = fopen ("casos.bin", "rb"); if (!fp) return 1; else while (fread (&criador, sizeof(Case), 1, fp)) printf("\nCodigo: %i\nDescricao: %s\nNumero de casos: %i\n",criador.violencia,criador.violenciadr,criador.casos); return 0; }; // estou fazendo ainda.... void gerar2arquivo(){ fp = fopen("casos.bin","r+"); if(!fp){ puts("Erro ao criar o arquivo"); exit(0); } fp2 = fopen("casos.bin","wb"); if(!fp2){ puts("Erro ao criar o arquivo"); exit(0); } } Compartilhar este post Link para o post Compartilhar em outros sites
reebr 94 Denunciar post Postado Junho 12, 2013 FILE *pf é um ponteiro p/ manipular um arquivo. Não usei como global p/ evitar o uso de memória de forma desnecessária. while ((!flag) && (fread (&criador, sizeof(Case), 1, fp) == 1)) // poderia me explicar essa laço ? if(criador.violencia == opt) { printf("\nOcorreram %i casos deste tipo.\n", criador.casos); flag = 1; } a variável "flag" seria como um "achou", p/ saber se existe um código de violencia com o mesmo número do que foi digitado. Se ele procurar no arquivo inteiro e o valor de "flag" for 0, significa que ele não encontrou o código. Então... if (!flag) return -1; else return 0; Só p/ ter um controle mesmo. Você pode usar como tipo de retorno "void" e exibir a mensagem dentro da própria função caso (!flag). Ex: if (!flag) printf("Codigo nao encontrado!"); Eu prefiro tratar essas coisas fora da função,Aí, na função main ficaria: if ((busca ()) != 0) printf("Numero nao encontrado"); abç. Compartilhar este post Link para o post Compartilhar em outros sites
Asskiller 4 Denunciar post Postado Junho 12, 2013 Estou tendo o seguinte erro , Visual Studio C++Vlw pela explicacao , o erro e no sscanf Compartilhar este post Link para o post Compartilhar em outros sites
reebr 94 Denunciar post Postado Junho 12, 2013 Use scanf normalmente, a sintaxe do meu código está errada, desculpe. Compartilhar este post Link para o post Compartilhar em outros sites
Asskiller 4 Denunciar post Postado Junho 12, 2013 Dei uma corrigida tudo funcionando perfeitamente , mas estou com o problema na volta do menu que te disse.E alguns outros abaixo que se voce compilar vera os erros. Estou tendo erros na funcao lecaso , nao esta exibindo a string toda do violenciadr Voce digita tipo agressao a mao armada , e ira exibir apenas agressao.Na funcao grava , estou tendo problemas para sair da funcao... A funcao busca esta OK /* Devido ao alto índice de violência que tem acontecido no Rio de Janeiro, e visando melhorar a sua estratégia de trabalho, uma empresa de segurança faz constantemente um levantamento de casos de violência registrados diariamente. Esta empresa armazena em um arquivo binário as informações de todos os tipos de violência registrados. Cada registro deste arquivo é composto pelos seguintes campos: Código do tipo de violência (inteiro) Descrição da violência (string de 100 posições) Número de casos ocorridos (inteiro) a) Faça uma função chamada le_casos(), que deve ler os dados do arquivo b) Faça uma função chamada busca_casos(), para realizar a busca de um código de tipo de violência no arquivo e exibir na tela o total de violências ocorridas deste tipo c) Faça uma função grava_casos(), que gera o arquivo d) Gerar um segundo arquivo com a situação atual na cidade considerando existir, no máximo, 10 diferentes tipos de códigos. Neste arquivo, serão gravados o código com a respectiva totalização de cada um Fazer chamada as funções criadas.*/ #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> using namespace System; void menu(); int lecaso (void); int grava (void); int busca(void); void gerar2arquivo(); struct Case{ int violencia; char violenciadr[100]; int casos; }criador; int select; int back; int main(array<System::String ^> ^args) { menu(); switch(select){ case 1: grava(); break; case 2: busca(); break; case 3: lecaso(); break; case 4: gerar2arquivo(); break; case 5: printf("Saindo...\n"); exit(0); break; default: printf("Opacao Invalida - Utilize o Menu"); menu(); }while(select != 5); system("pause"); return 0; } void menu(){ system("cls"); printf("|------------------------------------------------|\n"); printf("| 1 - Gravar Casos |\n"); printf("| 2 - Buscar Casos |\n"); printf("| 3 - Ler Casos |\n"); printf("| 4 - Situacao Atual da Cidade - Gerar |\n"); printf("| 5 - Sair |\n"); printf("|------------------------------------------------|\n"); printf("Entre com a Opcao :\n"); scanf("%d",&select); } int grava(void){ int opt; FILE *fp; fp = fopen("casos.bin","ab"); if(!fp){ puts("Erro ao criar o arquivo"); exit(0); } do{ printf ("Insira o codigo da violencia ou 0 p/ sair:"); criador.violencia = opt; scanf("%d",&opt); if(opt = 0) exit; puts("Digite a descricao da violencia:"); scanf("%s",&criador.violenciadr); fflush(stdin); puts("Digite o numero de casos:"); scanf("%d",&criador.casos); fwrite(&criador,sizeof(struct Case),1,fp); }while(opt != 0); fclose(fp); return 0; } int busca(void) { int opt = 0; int flag = 0; FILE *fp; printf ("Digite o codigo da violencia ou 0 p/ sair: "); if(scanf("%d",&opt)!= 0 ){ fp = fopen("casos.bin", "rb"); if(!fp) return 1; else{ // enquanto flag = 0 e leitra do blco , quando achar while ((!flag) && (fread (&criador, sizeof(Case), 1, fp) == 1)) if(criador.violencia == opt) { printf("\nOcorreram %i casos deste tipo.\n", criador.casos); flag = 1; } } if (!flag) return -1; else return 0; } }; int lecaso (void) { FILE *fp; fp = fopen ("casos.bin", "rb"); if (!fp) return 1; else while (fread (&criador, sizeof(Case), 1, fp)) printf("\nCodigo: %i\nDescricao: %s\nNumero de casos: %i\n",criador.violencia,criador.violenciadr,criador.casos); return 0; }; // estou fazendo ainda.... void gerar2arquivo(){ FILE *fp; FILE *fp2; fp = fopen("casos.bin","rb"); if(!fp){ puts("Erro ao criar o arquivo"); exit(0); } fp2 = fopen("casos.bin","ab"); if(!fp2){ puts("Erro ao criar o arquivo"); exit(0); } } Compartilhar este post Link para o post Compartilhar em outros sites
reebr 94 Denunciar post Postado Junho 13, 2013 Estou tendo erros na funcao lecaso , nao esta exibindo a string toda do violenciadr Voce digita tipo agressao a mao armada , e ira exibir apenas agressao. É porque o scanf na leitura de string não lê "espaços em branco". Se você digitar: Meu nome é Asskiler, ele só irá salvar o "Meu", o resto será perdido. Por isso fiz a leitura com fgets (é como um gets, com mais controle). -> http://www.cplusplus.com/reference/cstdio/fgets/ Na funcao grava , estou tendo problemas para sair da funcao... Dê uma olhada: int grava(void){ int opt; FILE *fp; fp = fopen("casos.bin","ab"); /* Desnecessário isto, usando "ab" mesmo que o arquivo não exista, ele será criado. * Caso já exista, os dados serão gravados abaixo dos que já estiverem no arquivo */ if(!fp){ puts("Erro ao criar o arquivo"); /* se o arquivo não existir, vai fechar o programa?!?! * seria melhor colocar um return, p/ ele voltar ao ponto em que a função foi chamada... */ exit(0); } do{ printf ("Insira o codigo da violencia ou 0 p/ sair:"); scanf("%d",&opt); /* se o número digitado for 0... retorna a onde a função foi chamada */ if (!opt) return; criador.violencia = opt; puts("Digite a descricao da violencia:"); scanf("%s",&criador.violenciadr); /* faça a leitura de string com fgets() */ fflush(stdin); // <<--- NÃO USE ISSOOOOOOOOOOOOOOOOOOOOOOOOOOOOO! puts("Digite o numero de casos:"); scanf("%d",&criador.casos); fwrite(&criador,sizeof(struct Case),1,fp); }while(opt != 0); fclose(fp); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
Asskiller 4 Denunciar post Postado Junho 13, 2013 int grava(void){ int opt; FILE *fp; fp = fopen("casos.bin","ab"); do{ printf ("Insira o codigo da violencia ou 0 p/ sair:"); scanf("%d",&opt); criador.violencia = opt; printf("Digite a descricao da violencia:\n"); scanf("%[^\n]",&criador.violenciadr); getchar(); printf("Digite o numero de casos:\n"); scanf("%d",&criador.casos); fwrite(&criador,sizeof(struct Case),1,fp); }while(opt != 0); fclose(fp); return 0; } Assim funcinou legal , porem esta exibindo as 2 perguntas juntas nao sei porque printf("Digite a descricao da violencia:\n"); scanf("%[^\n]",&criador.violenciadr); getchar(); printf("Digite o numero de casos:\n"); scanf("%d",&criador.casos); Ta exibiindo isto junto e com fgets deu erro no programa. E quando digito a opcao 0 para sair e digito 3 para exibir o programa continua executando a opcao 1 , ainda nao entendi o porque disso. Segue Funcao Gerar2Arquivo , pelo que entendi fica assim : void gerar2arquivo(){ FILE *fp; FILE *fp2; fp = fopen("casos.bin","rb"); if(!fp){ puts("Erro ao criar o arquivo"); exit(0); } fp2 = fopen("rjatual.bin","ab"); if(!fp2){ puts("Erro ao criar o arquivo"); exit(0); } else while (fread (&criador, sizeof(Case), 1, fp)) if(criador.casos <= 10){ puts("Situacao Atual na Cidade do Rio de Janeiro:"); printf("\nCodigo: %i\nDescricao: %s\nNumero de casos: %i\n",criador.violencia,criador.violenciadr,criador.casos); fwrite(&criador,sizeof(struct Case),1,fp2); return 0; } } Compartilhar este post Link para o post Compartilhar em outros sites
reebr 94 Denunciar post Postado Junho 13, 2013 int gravacaso (void) { int opt; char str[128]; FILE *fp; do { printf ("Insira o codigo da violencia ou 0 p/ sair:"); scanf("%d",&opt); if (!opt) { criador.violencia = opt; printf("Numero de casos: "); scanf("%d", &criador.casos); printf("Descrição da violencia: "); fgets(str, 128, stdin); str[strlen(str) - 1] = '\0'; strcpy(criador.violenciadr, str); fp = fopen("casos.bin","ab"); fwrite(&criador,sizeof(struct Case),1,fp); fclose (fp); } } while (!opt); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
Asskiller 4 Denunciar post Postado Junho 13, 2013 int grava(void) { int opt; char str[128]; FILE *fp; do { printf ("Insira o codigo da violencia ou 0 p/ sair:"); scanf("%d",&opt); if (opt !=0) { criador.violencia = opt; printf("Numero de casos: "); scanf("%d", &criador.casos); printf("Descrição da violencia: "); fflush(stdin); fgets(str, 128, stdin); str[strlen(str) - 1] = '\0'; strcpy(criador.violenciadr, str); fp = fopen("casos.bin","ab"); fwrite(&criador,sizeof(struct Case),1,fp); quantidade++; fclose (fp); } if(quantidade == 10){ puts("Quantidade de Casos de Violencia chegou ao MAXIMO"); puts("Obrigado por Informar..."); menu(); } if(opt == 0) menu(); }while (opt != 0); return 0; } Funcionou apenas com essa alterações....Ta ótimo , so funciona com maldito fflush... Voce sabe me dizer porque ao voltar ao menu quando digito 0 , eu nao consigo selecionar outra opcao ? Simples o programa trava e fica ali... parado... E a minha ideia na questao da variavel da quantidade , d) Gerar um segundo arquivo com a situação atual na cidade considerando existir, no máximo, 10 diferentes tipos de códigos. E usar a variavel quantidade todo o dado digitado sera contabilizado ali....Quando chegar a 10 o programa exibe que o registro ja esta no limite....E depois exibe no 4. if(quantidade == 10){ puts("Quantidade de Casos de Violencia chegou ao MAXIMO"); puts("Obrigado por Informar..."); menu(); Porem creio eu que eu teria que utilizar um fwrite para alocar essa variavel no arquivo. Porque se eu digitar 1 caso e fechar o programa , e depois abrir o programa e digitar outro caso.. A variavel vai interpretar como 1 inves de 2 dados digitados. Correto ? Compartilhar este post Link para o post Compartilhar em outros sites
Asskiller 4 Denunciar post Postado Junho 17, 2013 UP , poderia me dar essa ultima força neelix ?Estou quase finalizando so falta o problema da volta ao menu e a questão D. Compartilhar este post Link para o post Compartilhar em outros sites
reebr 94 Denunciar post Postado Junho 17, 2013 Não entendi p/ que criar outro arquivo se já existe todas as informações no "casos.bin". Poderia explicar melhor p/ que iria servir este outro arquivo ("situação da cidade") ? Compartilhar este post Link para o post Compartilhar em outros sites
Asskiller 4 Denunciar post Postado Junho 17, 2013 ) Gerar um segundo arquivo com a situação atual na cidade considerando existir, no máximo, 10 diferentes tipos de códigos. Gerar um segundo arquivo , considerando que no casos.bin , tenha 10 diferente codigos com suas respectivas violencias.E exibir todos esses codigos e suas violencias. Pelo que entendi foi isso , tipo caso eu insira 11 casos na função la em cima , na D o segundo arquivo ira exibir apenas os dez primeiros. Compartilhar este post Link para o post Compartilhar em outros sites
reebr 94 Denunciar post Postado Junho 17, 2013 Ainda não entendi O PORQUÊ, mas enfim... int situacao (void) { FILE *fcaso = NULL; if (! (fcaso = fopen ("casos.bin", "rb"))) return 1; // arquivo inexistente. else { FILE *fsituacao = NULL; fsituacao = fopen ("SituacaoCidade.bin", "wb"); int i = 0; struct caso _caso; while ((i < 10) && (fread (&_caso, sizeof(struct caso), 1, fcaso))) { fwrite (&_caso, sizeof(caso), 1, fsituacao); i++; } fclose (fcaso); fclose (fsituacao); } return 0; } (não testei) A função retorna 0 se tudo ocorrer normalmente, ou, 1 se o arquivo principal ("casos.bin") não existir. Compartilhar este post Link para o post Compartilhar em outros sites