Ir para conteúdo

Arquivado

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

Asskiller

Manipulaçao de Arquivos Inicializacao de Dados

Recommended Posts

 

/*
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

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

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

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
/*
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

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
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

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

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

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

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

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


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
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

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

) 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

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

×

Informação importante

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