Ir ao conteúdo
  • Cadastre-se

Posts recomendados

Postado

Bom, estou criando uma agenda em C,porém tenho uma duvida,como estou lendo uma struct com gets,todos os contatos ficam um do lado do outro,existe alguma maneira de fazer um gets() ler um '\n'?

  • Amei 1
Postado

@johnkaos         tem sim ,     mas a solução boa seria na hora de escrever na tela usar esse \n no printf,  pois esse comando gets da linguagem c é muito antigo e está causando falhas nos programas atuais de outros sistemas operacionais , então melhor não usa-lo , e ao invés dele use o fgets , e este sim faz a mesma coisa do gets e ele sim já coloca um \n no final dos dados pegos na leitura do teclado .

  mas caso queira mesmo colocar esse \n , pode ser assim  ?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    char variavel[25];    // isso é uma string na linguagem c
    gets(variavel);
    strcat(variavel,"\n");
    printf("%s",variavel);
    printf("%s\n\n",variavel);
    return 32768;
}

 

  • Curtir 1
Postado

@devair1010 esse é o código,é uma Agenda,o contato que falo é,quando preencho cada lista,as vezes fica restos de variaveis no outro,como citei em cima,se preencher um contato com johnkaos como nome,as vezes outro,como por exemplo o nome julia,fica com restos do nome,no arquivo txt e vira 'julia aos'... Eu quero organizar que cada contato fique em uma linha,porém com fgets,não iam virar colunas para cada membro da struct?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <locale.h>

void flush_in()
{
    int ch;

    while ( ( ch = fgetc ( stdin ) ) != '\n' && ch != EOF) {}
}
struct Cadastro
{
    int num;
    char nome[100];
    char endereco[100];
    char bairro[100];
    char cidade[30];
    char estado[30];
    char cep[10];
    char tel[20];
    char cel[20];
};

FILE *arquivo;
struct Cadastro C;

char menu()
{
    system ("cls");
    printf("______________________________ *** AGENDA ***________________________________\n\n");
    printf("1- Cadastrar\n");
    printf("2- Listar\n");
    printf("3- Buscar\n");
    printf("4- Alterar\n");
    printf("5- Deletar\n");
    printf("6- Sair\n\n");

    printf("\nOpção:\n");
    system ("color c");
    return (getchar());


}
/* Buscar Clientes*/


char buscanome(char n[100])
{
    fread(&C, sizeof(C), 1, arquivo);
    while(!feof(arquivo))
    {
        if(strcmp(C.nome,n) == 0)
        {
            fseek(arquivo, sizeof(C), SEEK_CUR);
            return 1;
        }
        fread(&C, sizeof(C), 1, arquivo);
    }
    return 0;
}
char buscacidade(char c[30])
{
    fread(&C, sizeof(C), 1, arquivo);
    while(!feof(arquivo))
    {
        if(strcmp(C.cidade,c) == 0)
        {
            fseek(arquivo, sizeof(C), SEEK_CUR);
            return 1;
        }
        fread(&C, sizeof(C), 1, arquivo);
    }
    return 0;
}
char buscaestado(char e[30])
{
    fread(&C, sizeof(C), 1, arquivo);
    while(!feof(arquivo))
    {
        if(strcmp(C.estado,e) == 0)
        {
            fseek(arquivo, sizeof(C), SEEK_CUR);
            return 1;
        }
        fread(&C, sizeof(C), 1, arquivo);
    }
    return 0;
}
/*Cadastro de Clientes*/

void cad()
{
    arquivo = fopen ("agenda.txt", "a+b");
    if(arquivo==NULL)
    {
        printf("\nErro ao abrir o arquivo \n");
        return;
    }
    C.num++;
    printf("\n\nNome:");
    fflush(stdin);
    gets(C.nome);
    printf("\nEndereço:");
    fflush(stdin);
    gets(C.endereco);
    printf("\nBairro:");
    fflush(stdin);
    gets(C.bairro);
    printf("\nCidade:");
    fflush(stdin);
    gets(C.cidade);
    printf("\nEstado:");
    fflush(stdin);
    gets(C.estado);
    printf("\nCep:");
    fflush(stdin);
    gets(C.cep);
    printf("\nTelefone Fixo:");
    fflush(stdin);
    gets(C.tel);
    printf("\nCelular:");
    fflush(stdin);
    gets(C.cel);
    fwrite(&C, sizeof(C), 1, arquivo);
    getchar();
    fclose(arquivo);
}

/*Listar*/

void listar()
{
    int i=0;
    arquivo= fopen("agenda.txt","rw");
    if(arquivo==NULL)
    {
        printf("Erro ao abrir o arquivo");
        return;
    }
    fread(&C, sizeof(C), 1, arquivo);
    printf("\nRelação de Clientes:\n");
    while(!feof(arquivo))
    {
        i++;
        printf("\n");
        printf("\nNome: %s\nEndereco: %s\nBairro: %s\nCidade: %s\nEstado: %s\nCep: %s\nTelefone: %s\nCelular: %s", C.nome, C.endereco, C.bairro, C.cidade, C.estado, C.cep, C.tel, C.cel);
        printf("\n");
        fread(&C, sizeof(C), 1, arquivo);
        if(feof(arquivo) || (i==20))
        {
            break;
            getchar();
            getchar();
        }
    }
    fclose(arquivo);
}

/*Buscar Clientes*/

void buscar()
{
    int aux;
    char opc;
    char nome[100];
    char cidade[30];
    char estado[30];
    arquivo = fopen("agenda.txt","rw");
    if(arquivo==NULL)
    {
        printf("\nErro ao abrir o arquivo\n");
    }
    system ("cls");
    printf("______________________________ *** CONSULTAS ***________________________________\n\n");
    printf("1- Busca por Nome\n");
    printf("2- Busca por Cidade\n");
    printf("3- Busca por Estado\n");
    system("color d");
    printf("opção:");
    getchar();
    opc = getchar();
    switch (opc)
    {
    case '1':
        printf("\n\nNome:");
        fflush(stdin);
        gets(nome);
        /*Busca(insc)*/
        if(buscanome(nome) == 0)
        {
            printf("\nNome inválido\n");
        }
        else
        {

            fread(&C, sizeof(C), 1, arquivo);
            printf("Nome: %s", C.nome);
            printf("\nEndereço: %s\n", C.endereco);
            printf("Bairro: %s\n", C.bairro);
            printf("Cidade: %s\n", C.cidade);
            printf("Estado: %s\n", C.estado);
            printf("Cep: %s\n", C.cep);
            printf("Telefone: %s\n", C.tel);
            printf("Celular: %s\n", C.cel);
            getchar();
            getchar();
        }


        fclose(arquivo);
        break;
    case '2':
        printf("\n\nCidade:");
        fflush(stdin);
        gets(cidade);
        printf("\n");
        /*Busca(insc)*/

        fread(&C, sizeof(C), 1, arquivo);
        while(!feof(arquivo))
        {

            if(strcmp(cidade,C.cidade) == 0)
            {
                printf("Nome: %s", C.nome);
                printf("\nEndereço: %s\n", C.endereco);
                printf("Bairro: %s\n", C.bairro);
                printf("Cidade: %s\n", C.cidade);
                printf("Estado: %s\n", C.estado);
                printf("Cep: %s\n", C.cep);
                printf("Telefone: %s\n", C.tel);
                printf("Celular: %s\n", C.cel);
                printf("\n");
                fread(&C, sizeof(C), 1, arquivo);
            }
            else
            {
                break;
                getchar();
            }
        }

        fclose(arquivo);
        break;


    case '3':
        printf("\n\nEstado:");
        fflush(stdin);
        gets(estado);
        printf("\n");
        /*Busca(insc)*/

        fread(&C, sizeof(C), 1, arquivo);
        while(!feof(arquivo))
        {

            if(strcmp(estado,C.estado) == 0)
            {
                printf("Nome: %s", C.nome);
                printf("\nEndereço: %s\n", C.endereco);
                printf("Bairro: %s\n", C.bairro);
                printf("Cidade: %s\n", C.cidade);
                printf("Estado: %s\n", C.estado);
                printf("Cep: %s\n", C.cep);
                printf("Telefone: %s\n", C.tel);
                printf("Celular: %s\n", C.cel);
                printf("\n");
                fread(&C, sizeof(C), 1, arquivo);
            }
            else
            {
                break;
                getchar();
            }
        }

        fclose(arquivo);
        break;



    }
}

void alterar()
{
    int opt;
    int posicao = 0;
    int achou = 0;
    char nomes[100];
    flush_in();
    printf("\nAlteracao de Cadastro\n");
    printf("Digite o  nome do contato:");
    gets(nomes);
    arquivo= fopen("agenda.txt","r+b");
    if(arquivo==NULL)
    {
        printf("Erro ao abrir o arquivo");
        return;
    }
    system("cls");
    opt = -1;
    while(fread(&C,sizeof(C), 1, arquivo)== 1 && opt!=0)
    {

        if(strcmp(nomes,C.nome)== 0)
        {

            printf("Nome: %s", C.nome);
            printf("\nEndereço: %s\n", C.endereco);
            printf("Bairro: %s\n", C.bairro);
            printf("Cidade: %s\n", C.cidade);
            printf("Estado: %s\n", C.estado);
            printf("Cep: %s\n", C.cep);
            printf("Telefone: %s\n", C.tel);
            printf("Celular: %s\n", C.cel);
            printf("\n\nVocê quer mesmo editar este contato? ");
            printf("\n1 - Sim\n2 - Não  \n");
            scanf("%d", &opt);
            flush_in();
            system("cls");
            switch(opt)
            {

            case 1:

                printf("\n\nNome:");
                fflush(stdin);
                gets(C.nome);
                printf("\nEndereco:");
                fflush(stdin);
                gets(C.endereco);
                printf("\nBairro:");
                fflush(stdin);
                gets(C.bairro);
                printf("\nCidade:");
                fflush(stdin);
                gets(C.cidade);
                printf("\nEstado:");
                fflush(stdin);
                gets(C.estado);
                printf("\nCep:");
                fflush(stdin);
                gets(C.cep);
                printf("\nTelefone Fixo:");
                fflush(stdin);
                gets(C.tel);
                printf("\nCelular:");
                fflush(stdin);
                gets(C.cel);


                fseek(arquivo, posicao, SEEK_SET);
                achou = fwrite(&C,sizeof(C),1,arquivo) == sizeof(C);
                break;

            case 2:
                printf("\n\nVocê cancelou a alteração do Contato!!\n");

                break;
            }

        }
        posicao = posicao + sizeof(C);
        fseek(arquivo, posicao, SEEK_SET);

    }
    opt = -1;
    fclose(arquivo);
}
void remover()
{

    FILE* arquivo = fopen("agenda.txt", "rw");
    FILE* novoArquivo = fopen("temp.txt", "w");
    char nomess[100];

    printf("Digite o nome do usuário a ser excluido: ");
    fflush(stdin);
    gets(nomess);
    while(!feof(arquivo))
    {
        fread(&C, sizeof(C), 1, arquivo);
        if(strcmp(nomess, C.nome) != 0)
        {
            fwrite(&C, sizeof(C), 1, novoArquivo);
            fread(&C, sizeof(C), 1, arquivo);

        }
        else
        {
            break;
            getchar();
        }
    }
    fclose(novoArquivo);
    fclose(arquivo);
    remove("agenda.txt");
    rename("temp.txt", "agenda.txt");

}
void sair()
{
    int i;
    printf("\nFinalizandoo");
    for (i=0; i<35; i++)
    {
        _sleep(500);
        system ("color a");
        printf(". ");
    }
    exit(1);
}

int main()
{
    setlocale(LC_ALL, "Portuguese");
    char op;
    while(op!='s')
    {
        op = menu();
        switch(op)
        {
        case'1': cad(); break;
            case'2': listar(); break;
                case'3': buscar(); break;
                    case'4': alterar(); break;
                        case'5': remover(); break;
                            case'6': sair(); break;

                                }



        getchar();
        getchar();
    }
}

 

  • Obrigado 1
Postado

@johnkaos    não consegui ver o quê acontece por que esse código não mostra o que foi cadastrado ,  mas não é por causa do gets que poderia ficar com esses caracteres juntos ao outro nome .   e se você está usando o comando fwrite e fread então o arquivo deveria ser bin ou dat , e não txt . 

Postado

 

3 horas atrás, johnkaos disse:

Eu quero organizar que cada contato fique em uma linha,porém com fgets,não iam virar colunas para cada membro da struct?

Entendi que os contatos são assim alinhados no arquivo.txt

A B C

 

Mas deseja é algo assim

A

B

C

 

Coloque o caractere quebra de linha  na struct

struct Cadastro
{
    int num;
    char nome[100];
    char endereco[100];
    char bairro[100];
    char cidade[30];
    char estado[30];
    char cep[10];
    char tel[20];
    char cel[20];
    char LF; // <---- Quebra de linha
};

 

Na função de cadastramento

void cad()
{
    /* ... */
  
    gets(C.cel);
    C.LF= getchar(); /* <--- Quebra de linha */ 
  
    fwrite(&C, sizeof(C), 1, arquivo);
    fclose(arquivo);
}

 

 

adicionado 34 minutos depois
3 horas atrás, johnkaos disse:

as vezes outro,como por exemplo o nome julia,fica com restos do nome,no arquivo txt e vira 'julia aos'

 

Sim, lógico são "restos" da string anterior que por ser maior que a atual sobrou com pedaços no final, evite com 'higienização' da struct (C).

 

/* ... */
C= (struct Cadastro){0};

 Zerar  C antes de usar C.

  • Obrigado 2
Postado

@mauro_b um problema que estou enfrentando agr,que não tinha percebido é:

tenho os contatos A,B,C. Se usar a função Remover,para apagar o A,ela apaga todos os outros dois contatos...

adicionado 41 minutos depois

Porém isto não ocorre sempre...

adicionado 50 minutos depois

@mauro_b @devair1010  A função está totalmente imprevisível...as vezes funciona corretamente,as vezes não...

tenho A B C D

os erros mais comuns são: se quero deletar A,todos os outros também são deletados..

se quero deletar C,B,D,todos menos A são deletados...

e as vezes ela funciona normal...

  • Obrigado 1
Postado

@mauro_b @devair1010  Aparentemente consegui resolver.

Mudei o While disso: 

while(!feof(arquivo))
    {
        fread(&C, sizeof(C), 1, arquivo);
        if(strcmp(nomess, C.nome) != 0)
        {
            fwrite(&C, sizeof(C), 1, novoArquivo);
            fread(&C, sizeof(C), 1, arquivo);

        }
        else
        {
            break;
            getchar();
        }
    }

 

 

 

adicionado 0 minutos depois

para isso:

while(!feof(arquivo))
    {
        fread(&C, sizeof(C), 1, arquivo);
        if(strcmp(nomess, C.nome))
        {

            fwrite(&C, sizeof(C), 1, novoArquivo);
            fread(&C, sizeof(C), 1, arquivo);


        }
    }

 

 

  • Obrigado 1
Postado

A primeira programação, a errada, interrompe a cópia quando encontra o excluído. A segundo programação, a certa copiando todos exceto o excluído.

"

  • Curtir 1
  • Obrigado 1
  • 2 semanas depois...
Postado
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <locale.h>

void flush_in()
{
    int ch;

    while ( ( ch = fgetc ( stdin ) ) != '\n' && ch != EOF) {}
}
struct Cadastro
{
    char nome[100];
    char endereco[100];
    char bairro[100];
    char cidade[30];
    char estado[30];
    char cep[10];
    char tel[20];
    char cel[20];
    char LF;
};

FILE *arquivo;
struct Cadastro C;

char menu()
{
    system ("cls");
    printf("______________________________ *** AGENDA ***________________________________\n\n");
    printf("1- Cadastrar\n");
    printf("2- Listar\n");
    printf("3- Buscar\n");
    printf("4- Alterar\n");
    printf("5- Deletar\n");
    printf("6- Sair\n\n");

    printf("\nOpção:\n");
    system ("color c");
    return (getchar());


}

/*Cadastro de Clientes*/

void cad()
{
    C = (struct Cadastro){0};
    arquivo = fopen ("agenda.txt", "a+b");
    if(arquivo==NULL)
    {
        printf("\nErro ao abrir o arquivo \n");
        return;
    }
    printf("\n\nCadastro de contatos:\n");
    printf("\n\nNome:");
    fflush(stdin);
    gets(C.nome);
    printf("\nEndereço:");
    fflush(stdin);
    gets(C.endereco);
    printf("\nBairro:");
    fflush(stdin);
    gets(C.bairro);
    printf("\nCidade:");
    fflush(stdin);
    gets(C.cidade);
    printf("\nEstado:");
    fflush(stdin);
    gets(C.estado);
    printf("\nCep:");
    fflush(stdin);
    gets(C.cep);
    printf("\nTelefone Fixo:");
    fflush(stdin);
    gets(C.tel);
    printf("\nCelular:");
    fflush(stdin);
    gets(C.cel);
    C.LF= getchar();
    fwrite(&C, sizeof(C), 1, arquivo);
    getchar();
    fclose(arquivo);
}

/*Listar*/

void listar()
{
    int i=0;
    arquivo= fopen("agenda.txt","rw");
    if(arquivo==NULL)
    {
        printf("Erro ao abrir o arquivo");
        return;
    }
    fread(&C, sizeof(C), 1, arquivo);
    printf("\nRelação de Contatos:\n");
    while(!feof(arquivo))
    {
        i++;
        printf("\n");
        printf("\nNome: %s\nEndereco: %s\nBairro: %s\nCidade: %s\nEstado: %s\nCep: %s\nTelefone: %s\nCelular: %s", C.nome, C.endereco, C.bairro, C.cidade, C.estado, C.cep, C.tel, C.cel);
        printf("\n");
        fread(&C, sizeof(C), 1, arquivo);
        if(feof(arquivo) || (i==20))
        {
            break;
            getchar();
            getchar();
        }
    }
    fclose(arquivo);
}

/*Buscar Clientes*/

void buscar()
{
    int aux;
    char opc;
    char nome[100];
    char cidade[30];
    char estado[30];
    arquivo = fopen("agenda.txt","rw");
    if(arquivo==NULL)
    {
        printf("\nErro ao abrir o arquivo\n");
    }
    system ("cls");
    printf("______________________________ *** CONSULTAS ***________________________________\n\n");
    printf("1- Busca por Nome\n");
    printf("2- Busca por Cidade\n");
    printf("3- Busca por Estado\n");
    system("color d");
    printf("opção:");
    getchar();
    opc = getchar();
    switch (opc)
    {
    case '1':
        printf("\n\nDigite o nome que deseja buscar:");
        fflush(stdin);
        gets(nome);
        /*Busca(insc)*/
        fread(&C, sizeof(C), 1, arquivo);
        while(!feof(arquivo))
        {

            if(strcmp(nome,C.nome) == 0)
            {
                printf("Nome: %s", C.nome);
                printf("\nEndereço: %s\n", C.endereco);
                printf("Bairro: %s\n", C.bairro);
                printf("Cidade: %s\n", C.cidade);
                printf("Estado: %s\n", C.estado);
                printf("Cep: %s\n", C.cep);
                printf("Telefone: %s\n", C.tel);
                printf("Celular: %s\n", C.cel);
                printf("\n");
            }
                fread(&C, sizeof(C), 1, arquivo);
        }
        fclose(arquivo);
        break;
    case '2':
        printf("\n\nCidade:");
        fflush(stdin);
        gets(cidade);
        printf("\n");
        /*Busca(insc)*/

        fread(&C, sizeof(C), 1, arquivo);
        while(!feof(arquivo))
        {

            if(strcmp(cidade,C.cidade) == 0)
            {
                printf("Nome: %s", C.nome);
                printf("\nEndereço: %s\n", C.endereco);
                printf("Bairro: %s\n", C.bairro);
                printf("Cidade: %s\n", C.cidade);
                printf("Estado: %s\n", C.estado);
                printf("Cep: %s\n", C.cep);
                printf("Telefone: %s\n", C.tel);
                printf("Celular: %s\n", C.cel);
                printf("\n");
                fread(&C, sizeof(C), 1, arquivo);
            }
            else
            {
                fread(&C, sizeof(C), 1, arquivo);
            }
        }

        fclose(arquivo);
        break;


    case '3':
        printf("\n\nEstado:");
        fflush(stdin);
        gets(estado);
        printf("\n");
        /*Busca(insc)*/

        fread(&C, sizeof(C), 1, arquivo);
        while(!feof(arquivo))
        {

            if(strcmp(estado,C.estado) == 0)
            {
                printf("Nome: %s", C.nome);
                printf("\nEndereço: %s\n", C.endereco);
                printf("Bairro: %s\n", C.bairro);
                printf("Cidade: %s\n", C.cidade);
                printf("Estado: %s\n", C.estado);
                printf("Cep: %s\n", C.cep);
                printf("Telefone: %s\n", C.tel);
                printf("Celular: %s\n", C.cel);
                printf("\n");
                fread(&C, sizeof(C), 1, arquivo);
            }
            else
            {
               fread(&C, sizeof(C), 1, arquivo);
            }
        }

        fclose(arquivo);
        break;



    }
}

void alterar()
{
    int opt;
    int posicao = 0;
    int achou = 0;
    char nomes[100];
    flush_in();
    printf("\nAlteracao de Cadastro\n");
    arquivo= fopen("agenda.txt","r+b");
    if(arquivo==NULL)
    {
        printf("Erro ao abrir o arquivo!");
        return;
    }
    printf("Digite o  nome do contato:");
    gets(nomes);
    system("cls");
    opt = -1;
    while(fread(&C,sizeof(C), 1, arquivo)== 1 && opt!=0)
    {

        if(strcmp(nomes,C.nome)== 0)
        {

            printf("Nome: %s", C.nome);
            printf("\nEndereço: %s\n", C.endereco);
            printf("Bairro: %s\n", C.bairro);
            printf("Cidade: %s\n", C.cidade);
            printf("Estado: %s\n", C.estado);
            printf("Cep: %s\n", C.cep);
            printf("Telefone: %s\n", C.tel);
            printf("Celular: %s\n", C.cel);
            printf("\n\nVocê quer mesmo editar este contato? ");
            printf("\n1 - Sim\n2 - Não  \n");
            scanf("%d", &opt);
            flush_in();
            system("cls");
            switch(opt)
            {

            case 1:

                printf("\n\nNome:");
                fflush(stdin);
                gets(C.nome);
                printf("\nEndereco:");
                fflush(stdin);
                gets(C.endereco);
                printf("\nBairro:");
                fflush(stdin);
                gets(C.bairro);
                printf("\nCidade:");
                fflush(stdin);
                gets(C.cidade);
                printf("\nEstado:");
                fflush(stdin);
                gets(C.estado);
                printf("\nCep:");
                fflush(stdin);
                gets(C.cep);
                printf("\nTelefone Fixo:");
                fflush(stdin);
                gets(C.tel);
                printf("\nCelular:");
                fflush(stdin);
                gets(C.cel);


                fseek(arquivo, posicao, SEEK_SET);
                achou = fwrite(&C,sizeof(C),1,arquivo) == sizeof(C);
                break;

            case 2:
                printf("\n\nVocê cancelou a alteração do Contato!!\n");

                break;
            }

        }
        posicao = posicao + sizeof(C);
        fseek(arquivo, posicao, SEEK_SET);

    }
    opt = -1;
    fclose(arquivo);
}
void remover()
{

    FILE* arquivo = fopen("agenda.txt", "rw");
    if(arquivo==NULL)
    {
        printf("Erro ao abrir o arquivo!");
        return;
    }
    FILE* novoArquivo = fopen("temp.txt", "w");
    char nomess[100];

    printf("Digite o nome do usuário a ser excluido: ");
    fflush(stdin);
    gets(nomess);
    fread(&C, sizeof(C), 1, arquivo);

    while(!feof(arquivo))
    {

        if(strcmp(nomess, C.nome)!=0)
        {
            fwrite(&C, sizeof(C), 1, novoArquivo);

        }
        fread(&C, sizeof(C), 1, arquivo);
    }
    fclose(novoArquivo);
    fclose(arquivo);
    remove("agenda.txt");
    rename("temp.txt", "agenda.txt");

}
void sair()
{
    int i;
    printf("\nFinalizandoo");
    for (i=0; i<35; i++)
    {
        _sleep(100);
        system ("color a");
        printf(". ");
    }
    exit(1);
}

int main()
{
    setlocale(LC_ALL, "Portuguese");
    char op;
    while(op!='s')
    {
        op = menu();
        switch(op)
        {
        case'1': cad(); break;
            case'2': listar(); break;
                case'3': buscar(); break;
                    case'4': alterar(); break;
                        case'5': remover(); break;
                            case'6': sair(); break;

                                }



        getchar();
        getchar();
    }
}

@devair1010 Esse código foi a versão final que eu fiz,porém ele se encontra com o seguinte bug:

tenho os contatos A B C D

todas as funções funcionam normalmente,usadas em ordem. porém se usar a função remover,antes da alterar,quando vou usar a função alterar,ela simplesmente só lê o contato A,se buscar o contato B,C,D, ela não retorrna eles,alias,não retorna nada.

  • Curtir 1
Postado

Seu programa foi escrito de um modo complicado e muito frágil

 

  • Não use dados direto do arquivo. Isso só dá problema. Se tiver mesmo que usar isso consulte em seu compilador as diretivas #pragma e o sizeof() de sua estrutura e teste antes
  • Imagine que se der um erro ou cancelar seu programa no meio por qualquer razão vai quase certamente corromper seu arquivo e vai perder tudo
  • Não use leitura e processamento na mesma função. Ou gravação e processamento. Só vai atrasar tudo
  • main() deve ser a primeira função de seu programa
  • não use gets() isso não existe mais na prática há décadas. E mesmo que tenha acesso a um compilador com isso não é esperto: gets() não tem controle
  • leia o conteúdo do arquivo para um vetor de struct.
  • ao final do programa grave os dados para um novo arquivo com outro nome. Apague ou renomeie o original. E mude o nome do arquivo novo para o original, como todo programa sério faz
  • se precisa de total segurança vá gravando tudo que muda no arquivo num arquivo de "log" que registra toda alteração. Ao final depois de gravar o arquivo de saída apaga o arquivo de log. A lógica é simples: ao iniciar o programa se existir o arquivo de log é porque o programa não terminou bem... E aí você abre o arquivo de log e refaz tudo que está lá.
  • não use fflush()de stdin não faz sentido. em especial com gets() ou fgets()

Sobre sua pergunta


Não se coloca nada num gets(). Não se usa gets(). Mas não se "coloca"  nada num fgets(), também. Nem um '\n'. Entenda que fgets() lê da entrada até encontrar um '\n' e retorna com o próprio '\n' ao final da string.

Na verdade em um caso especial gets() inclui um '\n' ao ler um fim de arquivo e não ter nada na entrada...

 

 

 

  • Curtir 2
Postado

@johnkaos     creio que essa linha na função remover ,

 

FILE* arquivo = fopen("agenda.txt", "rw"); // aqui cria e reseta o arquivo

 

seja a causa de não ler mais nada após ir na função remover (); , pois ali você deveria abrir o  arquivo que já tem dados gravados nele ,  mas o que faz é criar e resetar o arquivo para gravações desde o início ,  e asim não terá nada nele mesmo ,  então poderia ser assim  :

FILE* arquivo = fopen("agenda.txt", "rb");

  • Curtir 1
Postado
Em 29/09/2020 às 21:25, devair1010 disse:

mas a solução boa seria na hora de escrever na tela usar esse \n no printf,  pois esse comando gets da linguagem c é muito antigo e está causando falhas nos programas atuais de outros sistemas operacionais , então melhor não usa-lo , e ao invés dele use o fgets , e este sim faz a mesma coisa do gets e ele sim já coloca um \n no final dos dados pegos na leitura do teclado

 

Sim, gets() é algo antigo, marcada como obsoleta há uns 20 anos. E não deve ser usada.

Não 'causa problemas' mas alguns compiladores podem não aceitar ou ficar dando mensagens...

Não há razão para usar isso: a versão recomendada é fgets() que é a mesma coisa mas exige um parâmetro com o máximo de caracteres, e isso é bom.

 

gets() ou fgets() não colocam um '\n' em lugar algum. apenas elas retornam quando leêm um '\n' e mantem o '\n' na string lida. Só isso. Em geral ao ler com gets() ou fgets() você "imprime" com puts() então manter o '\n' é importante.

 

Em um único caso gets() insere um '\n':  no final de arquivo se a última linha não terminava com '\n' . Só nesse caso.

 

  • Curtir 1
  • Obrigado 1
Postado

@devair1010 Depois de tanto pesquiser encontrei o erro...

FILE* novoArquivo = fopen("temp.txt", "w");

essa é a linha do erro,pois eu estava criando um arquivo só pra escrita,porém o novo arquivo iria substituir o antigo,e ele seria pra leitura e escrita,então o certo seria:

FILE* novoArquivo = fopen("temp.txt", "a+b");

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...