Sales Rank in C

0

The "find player" command in my code is not working, and I also want to add a command that deletes the ranking data. Can anyone help?

Follow the code:

#include<stdio.h>

#include<stdlib.h>

typedef struct{
    char nome[25];
    char meta[10];
    int vendas;
}ranking;

ranking rank;

FILE *arqrank;

//Protótipo das funções
void abre_arquivo(void);
void menu();
void iserir();
void mostrar();
void buscar();
void procurar(char nom[25]);
int dados(int i);

int main(){

    int opcao;
    char nomerk;
    abre_arquivo();

    do{
        system("cls");
        printf("PROGRAMA RANKING\n\n\n");
        menu();
        printf("\nEscolha uma opcao: ");
        scanf("%d",&opcao);

        switch(opcao){
            case 1: iserir();  break;
            case 2: mostrar(); break;
            case 3: buscar();  break;
            case 5: exit(1);   break;
            default: printf("\n\nOpcao invalida\n");
            system("pause");
            break;
        }
    }while(opcao != 5);

    system("pause");

}//Fim de main

void abre_arquivo(void){//Abre o arquivo

     arqrank=fopen("arquranking.txt","a+b");

}

void menu(){
    printf("MENU\n\n");
    printf("Inserir Dados   1\n");
    printf("Mostrar Ranking 2\n");
    printf("Buscar Jogador  3\n");
    //printf("Buscar Jogador  4\n");
    printf("Sair            5\n");
}

void iserir(){

    system("cls");
    printf("Inerir\n\n");
    printf("Nome: ");
    fflush(stdin);
    gets(rank.nome);
    printf("Meta: ");
    fflush(stdin);
    gets(rank.meta);
    printf("Vendas: ");
    scanf("%i",&rank.vendas);

    fseek(arqrank, 0, SEEK_END);//Procura o fim do arquivo
    fwrite(&rank, sizeof(ranking), 1, arqrank);//Insere os dados no arquivo
    printf("\n\nOperacao realizada\n\n");

    system("pause");
}

void mostrar(){

    //Exibe em forma de tabela (SQL)
    int j=1;
    printf("\n __________________________________________________");
    printf("\n|COLOCACAO   |NOME           |META     |VENDAS     |");
    printf("\n|____________|_______________|_________|___________|");

    rewind(arqrank);//Move o cursor para o inicio do arquivo

    do
    {

        fread(&rank, sizeof(ranking), 1, arqrank);//Lê o arquivo linha-a-linha
        dados(j);
        if(feof(arqrank)==0);
            j++;

    }while(feof(arqrank)==0);

    printf("\n|____________|_______________|_________|___________|");
    printf("\nTecle [Enter] para voltar ao menu...");
    system("pause>null");

}

void buscar(){

    char nomejog[25];
    system("cls");
    printf("Buscar Jogador\n\n");
    printf("Digite o nome do jogador: ");
    fflush(stdin);
    gets(nomejog);
    rewind(arqrank);//Cursor para o inicio

    do{
        fread(&rank, sizeof(ranking), 1, arqrank);//Faz a leitura do arquivo
        if(nomejog==rank.nome)//Se o nome procurado for encontrado
            mostrar();//Mostra os dados do jogador

    }while(feof(arqrank)==0 && nomejog!=rank.nome);//Até que chegue ao fim do arquivo

    if(nomejog!=rank.nome)
        printf("Nao encontrado\n\n");
    system("pause");

}

void procurar(char nom[25]){

    rewind(arqrank);//Cursor no inicio

    do{
        fread(&rank, sizeof(ranking), 1, arqrank);
        if(nom==rank.nome)
            mostrar();//Exibe as informações do determinado jogador casoo exista
    }while(feof(arqrank)==0 && nom!=rank.nome);
    if(nom!=rank.nome)//Se não existir
        printf("Nao encontrado\n\n");
    system("pause");
}

int dados(int i){
    /*Esta função a linha contendo os dados do jogador, linha-a-linha.
        de aocordo com a quantidade
    */
    printf("\n|%do COLOCADO |%-15s|%-9s|%-11d|",i,rank.nome,rank.meta,rank.vendas);
    }
    
asked by anonymous 05.06.2017 / 00:08

1 answer

0

Rodrigo, The error is in the String comparison. When you do nomejog == rank.nome , you are comparing whether the addresses pointed to by char are equal. The correct thing is you compare Strings using the strcmp() function of the <string.h> library. Take a look at the modified function below

Other things may cause unexpected effects on your code such as the use of the scanf() function to get strings, it is recommended to use the fgets(ponteiro de entrada, tamanho da string máxima, arquivo de saida) function, another function I do not recommend is fflush(stdin) for buffer cleaning. entry, it can have unexpected effects for different machines, use setbuf(stdin, NULL) .

NOTE: I used getchar() to wait for user interaction just because system("pause") does not work in LINUX.

void buscar(){

char nomejog[25];
system("clear");
printf("Buscar Jogador\n\n");
printf("Digite o nome do jogador: ");
setbuf(stdin, NULL);
fgets(nomejog, 25, stdin);
nomejog[strlen(nomejog) - 1] = '
void buscar(){

char nomejog[25];
system("clear");
printf("Buscar Jogador\n\n");
printf("Digite o nome do jogador: ");
setbuf(stdin, NULL);
fgets(nomejog, 25, stdin);
nomejog[strlen(nomejog) - 1] = '%pre%'; //remove o caractere '\n' do fim da string
rewind(arqrank);//Cursor para o inicio

do{
    fread(&rank, sizeof(ranking), 1, arqrank);//Faz a leitura do arquivo
    if(!strcmp(nomejog, rank.nome))//Se o nome procurado for encontrado
        mostrar();//Mostra os dados do jogador

}while(feof(arqrank)==0 && strcmp(nomejog,rank.nome));//Até que chegue ao fim do arquivo

if(nomejog!=rank.nome)
    printf("Nao encontrado\n\n");
getchar();

}
'; //remove o caractere '\n' do fim da string rewind(arqrank);//Cursor para o inicio do{ fread(&rank, sizeof(ranking), 1, arqrank);//Faz a leitura do arquivo if(!strcmp(nomejog, rank.nome))//Se o nome procurado for encontrado mostrar();//Mostra os dados do jogador }while(feof(arqrank)==0 && strcmp(nomejog,rank.nome));//Até que chegue ao fim do arquivo if(nomejog!=rank.nome) printf("Nao encontrado\n\n"); getchar(); }
    
05.06.2017 / 02:04