Ir ao conteúdo

Posts recomendados

Postado

Bom Dia Pessoal,

 

Estou criando um pequeno programa para cadastro de alunos e notas, Já finalizei toda a estrutura de cadastro, listagem dos alunos cadastrados e a pesquisa por nome dos alunos, mas a estrutura de excluir  algum registro já criado me deixou sem saída, não consegui aplicar nenhuma solução lógica para corrigir o problema. 

Alguém conseguiria me ajudar de alguma forma?

 

Segue abaixo o código:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

typedef struct
{
    char nome[50];
    float notas[4];
    int ativo;
    int matricula;
}Aluno;
Aluno ctt;
char c;
int op;

void cabecalho();
void inserir();
void excluir();
void pesquisar();
void listar();
int main(void)
{
    do
    {
        cabecalho();
        printf("\n1 - Incluir");
        printf("\n2 - Excluir");
        printf("\n3 - Pesquisar");
        printf("\n4 - Listar Todos");
        printf("\n0 - Sair\n\n");

        printf("Escolha uma opção: ");
        scanf("%d", &op);

        switch(op)
        {
            case 1:
                inserir();
            break;
            case 2:
                excluir();
            break;
            case 3:
                pesquisar();
            break;
            case 4:
                listar();
            break;
            case 0:
                printf("Obrigado pela visita!");
            break;
            default:
                printf("Opção Inválida");
                break;
        }


    }while(op!=0);

}
void cabecalho()
{
    system("cls");
    printf("###########################################\n");
    printf("#     PROGRAMA PARA CADASTRO DE NOTAS     #\n");
    printf("###########################################\n\n");
}
void inserir()
{
    int matricula=1;
    FILE *arq;
    arq = fopen("Alunos.txt","ab");

    if(arq==NULL)
    {
        printf("Error!");
        exit(1);
    }
    else
    {
        do
        {
            cabecalho();

                ctt.ativo=1;
                ctt.matricula++;
                fflush(stdin);
                printf("Digite o nome: ");
                gets(ctt.nome);
                printf("1 - Bimestre: ");
                scanf("%f", &ctt.notas[0]);
                printf("2 - Bimestre: ");
                scanf("%f", &ctt.notas[1]);
                printf("3 - Bimestre: ");
                scanf("%f", &ctt.notas[2]);
                printf("4 - Bimestre: ");
                scanf("%f", &ctt.notas[3]);

            fwrite(&ctt,sizeof(Aluno),1,arq);
            printf("Deseja Cadastrar novo Aluno (s/n)");
        }while(getche() =='s');
        getchar();
    }
    fclose(arq);
}
void excluir()
{
    int matriculaP;
    FILE *arq;
    arq = fopen("Alunos.txt","a+b");

    if(arq==NULL)
    {
        printf("Error!");
        exit(1);
    }
    else
    {
        do
        {
            cabecalho();
            fflush(stdin);
            printf("\nDigite a matricula a ser pesquisada: ");
            scanf("%d", &matriculaP);
            
            printf("Deseja Fazer nova consulta (s/n)?");
        }while(getche()=='s');
        getchar();
    }
    fclose(arq);
}

void pesquisar()
{
    char nomeP[50];
    int i;

    FILE *arq;
    arq = fopen("Alunos.txt","rb");

    if(arq==NULL)
    {
        printf("Error!");
        exit(1);
    }
    else
    {
        do
        {
            cabecalho();
            fflush(stdin);
            printf("\nDigite o nome a ser pesquisado: ");
            gets(nomeP);
            fread(&ctt,sizeof(Aluno),1,arq)==1;
            if(strcmp(nomeP,ctt.nome)==0)
            {
                printf("\n\nStatus: %d",ctt.ativo);
                if(ctt.ativo == 1)
                {
                    printf(" - Ativo");
                }
                else
                {
                    printf(" - Inativo");
                }
                printf("\nMatricula: %d", ctt.matricula);
                printf("\nNome: %s", ctt.nome);

                for(i=0;i<4;i++)
                {
                    printf("\n%d - Bimestre: %f",i+1, ctt.notas[i]);
                }
                printf("\n----------------\n\n");
            }
            else
            {
                printf("\nNome não encontrado!\n\n");
            }
            printf("Deseja Fazer nova consulta (s/n)?");
        }while(getche()=='s');
        getchar();
    }
    fclose(arq);
}
void listar()
{
    cabecalho();
    int i;
    int j=1;
    FILE *arq;
    arq = fopen("Alunos.txt","rb");

    if(arq==NULL)
    {
        printf("Error!");
        exit(1);
    }
    else
    {
            while(fread(&ctt,sizeof(Aluno),1,arq)==1)
            {
                if(ctt.ativo == 1)
                {
                    printf("\nMatricula: %d", ctt.matricula);
                    printf("\nNome: %s", ctt.nome);
                    for(i=0;i<4;i++)
                    {
                        printf("\n%d - Bimestre: %f",i+1, ctt.notas[i]);
                    }
                    printf("\n----------------\n\n");
                }
            };
    }
    fclose(arq);
    getch();
}

 

Postado

A ideia é pesquisar a matrícula a ser excluída no arquivo até encontrá-la, contando o número de alunos até ele, ou seja encontra a posição dele no arquivo, então usa fseek pra mover a posição de leitura/escrita no arquivo até o local imediatamente anterior a esta entrada, e escreve o registro do aluno novamente no mesmo local do arquivo apenas mudando o valor de "ativo" para "inativo".

 

Aí a informação estará "excluída" (e é aí que os sites de rede social mentem pra você quando você pede para excluírem sua conta e dados, eles ainda tem todas as informações lá)...

  • Curtir 2
Postado

Supondo que você já tenha localizado a matrícula a ser excluída, e tenha sua posição no arquivo, os dados do aluno em questão em estarão em ctt, e podemos fazer algo do tipo:

ctt.ativo=0;  //Inativo
fseek(arq, (posicao - 1)*sizeof(Aluno), SEEK_SET);
fwrite(&ctt, sizeof(Aluno), 1, arq);

Pra entender o fseek():

- O primeiro parâmetro indica a stream sendo processada, no caso o nosso arquivo.

- O segundo parâmetro indica o offset/deslocamento para posicionar o leitura/escrita no arquivo imediatamente anterior a entrada do aluno a ser "excluído".

- E o terceiro parâmetro indica a partir de onde o deslocamento deve ser feito, nesse caso usamos SEEK_SET que indica que o deslocamento deve ser a partir do início do arquivo (poderiam serem usados SEEK_CUR para começar a partir da posição atual, ou SEEK_END para começar a partir do fim do arquivo).

 

 

Postado

@Intruder18  Você também poderia ao invés de salvar os cadastros em um arquivo .txt salvá-los em um arquivo .csv, dessa forma cada cadastro corresponde a uma única linha do arquivo, sendo assim, para excluir o cadastro bastava apenas que excluísse a linha inteira.

Postado

Estou tentando da seguinte forma: Mas aparentemente estou com problemas com o while:

void editar()
{
    int posicao = 0; // Inicio do Arquivo;
    int achou = 0;
    char AltCpf[30];
    char AltNome[50];


    fflush(stdin);
    printf("Digite o CPF");
    gets(AltCpf);

    arquivo = fopen("base.txt","r+b");
    fseek(arquivo, posicao, SEEK_SET);

    system("cls");
    while(fread(&ctt, sizeof(CONTATO), 1, arquivo)==1)
    {
        if(strcmp(AltCpf,ctt.cpf)==0)
        {
            printf("\n1 - Nome: %s",ctt.nome);
            printf("\n2 - CPF: %s",ctt.cpf);
            printf("\n0 - Voltar");
            printf("\n-------------\n\n");

            printf("\n\nEscolha uma opção: ");
            scanf("%d", &op);

            switch(op)
            {
                case 1:
                    fflush(stdin);
                    printf("Digite o Novo nome: ");
                    gets(ctt.nome);

                    fseek(arquivo, posicao, SEEK_SET);
                    achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO);

                    // ajustar posicao em relação ao inicio do arquivo
                    posicao = posicao + sizeof(CONTATO);
                break;
                case 2:
                    fflush(stdin);
                    printf("Digite o novo CPF: ");
                    gets(ctt.AltCpf);

                    fseek(arquivo, posicao, SEEK_SET);
                    achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO);

                    // ajustar posicao em relação ao inicio do arquivo
                    posicao = posicao + sizeof(CONTATO);
                break;
                
                case 0:
                    main();
                break;
                default:
                    printf("\nOpção Inválida!");
                break;
            }

        }
    }
    fclose(arquivo);
}

 

Postado

@vangodp Quando eu peço para editar alguma informação, o programa edita normalmente, mas enche o arquivo com duplicações vazias.. Vou postar o programa todo e faça um teste, cadastre dois contatos usando a opção 1, depois liste os contatos usando a opção dois, por fim teste a opção 3 para editar.

 

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

typedef struct contato CONTATO;
struct contato
{
    int ativo;
    char nome[50];
    char cpf[30]
};
void cadastrar();
void listar();
void editar();
//VARIAVEL UNIVERSAL
FILE *arquivo;
CONTATO ctt;
int op;
int main(void)
{
    setlocale(LC_ALL, "Portuguese");
    do
    {
        system("cls");
        printf("\n1 - Cadastrar");
        printf("\n2 - Listar");
        printf("\n3 - Editar");
        printf("\n0 - Sair\n\n");

        printf("Digite uma opção: ");
        scanf("%d", &op);

        switch(op)
        {
            case 1:
                cadastrar();
            break;
            case 2:
                listar();
            break;
            case 3:
                editar();
            break;
            case 0:
            break;
            default:
                printf("Opção Inválida!");
            break;
        }

    }while(op!=0);
}
void cadastrar()
{
    do
    {
        arquivo = fopen("base.txt","a+b");
        system("cls");
        fflush(stdin);
        printf("Nome: ");
        gets(ctt.nome);

        fflush(stdin);
        printf("CPF: ");
        gets(ctt.cpf);

        ctt.ativo = 1;

        fwrite(&ctt, sizeof(CONTATO),1,arquivo);
        fclose(arquivo);
        printf("Deseja realizar novo Cadastro (s/n)?");
    }while(getche()=='s');

}
void listar()
{
    system("cls");

    arquivo = fopen("base.txt","rb");

    while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1)
    {
        printf("Status: %d\n", ctt.ativo);
        printf("Nome: %s\n",ctt.nome);
        printf("CPF: %s\n",ctt.cpf);
        printf("--------------------\n\n");
    }
    fclose(arquivo);
    getch();

}
void editar()
{
    int posicao = 0; // Inicio do Arquivo;
    int achou = 0;
    char AltCpf[30];
    char AltNome[50];


    fflush(stdin);
    printf("Digite o CPF");
    gets(AltCpf);

    arquivo = fopen("base.txt","r+b");
    fseek(arquivo, posicao, SEEK_SET);

    system("cls");
    while(fread(&ctt, sizeof(CONTATO), 1, arquivo)==1)
    {
        if(strcmp(AltCpf,ctt.cpf)==0)
        {
            printf("\n1 - Nome: %s",ctt.nome);
            printf("\n2 - CPF: %s",ctt.cpf);
            printf("\n0 - Voltar");
            printf("\n-------------\n\n");

            printf("\n\nEscolha uma opção: ");
            scanf("%d", &op);

            switch(op)
            {
                case 1:
                    fflush(stdin);
                    printf("Digite o Novo nome: ");
                    gets(ctt.nome);

                    fseek(arquivo, posicao, SEEK_SET);
                    achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO);

                    // ajustar posicao em relação ao inicio do arquivo
                    posicao = posicao + sizeof(CONTATO);
                break;
                case 2:
                    fflush(stdin);
                    printf("Digite o novo CPF: ");
                    gets(ctt.cpf);

                    fseek(arquivo, posicao, SEEK_SET);
                    achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO);

                    // ajustar posicao em relação ao inicio do arquivo
                    posicao = posicao + sizeof(CONTATO);
                break;

                case 0:
                    main();
                break;
                default:
                    printf("\nOpção Inválida!");
                break;
            }

        }
    }
    fclose(arquivo);
}

 

Postado
15 horas atrás, vangodp disse:

A extensão do arquivo não importa, realmente não existe "linhas" em arquivos, existe diferentes formas de mostrar o arquivo para o usuário, porém lembre que a memória é linear. O que você vê como:
frase1
frase2
frase3

 

Na realidade é:
frase1\nfrase2\nfrase3

Para que o arquivo seja como você diz é só abrir ele em modo de testo plano.

 

 

Não disse que importava, sei como funciona, mas organiza melhor ao abrir o arquivo em programas como o Excel por exemplo.

Postado

@vangodp @Gustavo.Loggin Os exemplos usados aqui lidam com arquivos armazenando informações em modo binário, não modo texto, logo nada disso se aplica.

 

 

 

@Intruder18 Fiz algumas alterações no código, e comentários do motivo, mas não testei já que compiladores online não aceitam a biblioteca <conio.h>, e não estou em casa... Testa e veja se funcionou.

 

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

typedef struct contato CONTATO;
struct contato
{
    int ativo;
    char nome[50];
    char cpf[30]
};
void cadastrar();
void listar();
void editar();
//VARIAVEL UNIVERSAL
FILE *arquivo;
CONTATO ctt;
int op;
int main(void)
{
    setlocale(LC_ALL, "Portuguese");
    do
    {
        system("cls");
        printf("\n1 - Cadastrar");
        printf("\n2 - Listar");
        printf("\n3 - Editar");
        printf("\n0 - Sair\n\n");

        printf("Digite uma opção: ");
        scanf("%d", &op);

        switch(op)
        {
            case 1:
                cadastrar();
            break;
            case 2:
                listar();
            break;
            case 3:
                editar();
            break;
            case 0:
            break;
            default:
                printf("Opção Inválida!");
            break;
        }

    }while(op!=0);
}
void cadastrar()
{
    do
    {
        arquivo = fopen("base.txt","a+b");
        system("cls");
        fflush(stdin);
        printf("Nome: ");
        gets(ctt.nome);

        fflush(stdin);
        printf("CPF: ");
        gets(ctt.cpf);

        ctt.ativo = 1;

        fwrite(&ctt, sizeof(CONTATO),1,arquivo);
        fclose(arquivo);
        printf("Deseja realizar novo Cadastro (s/n)?");
    }while(getche()=='s');

}
void listar()
{
    system("cls");

    arquivo = fopen("base.txt","rb");

    while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1)
    {
        printf("Status: %d\n", ctt.ativo);
        printf("Nome: %s\n",ctt.nome);
        printf("CPF: %s\n",ctt.cpf);
        printf("--------------------\n\n");
    }
    fclose(arquivo);
    getch();

}
void editar()
{
    int posicao = 0; // Inicio do Arquivo;
    int achou = 0;
    char AltCpf[30];
    char AltNome[50];


    fflush(stdin);
    printf("Digite o CPF");
    gets(AltCpf);

    arquivo = fopen("base.txt","r+b");
    /*Não sei porque você está reposicionando a leitura aqui, visto que
    já está no começo do arquivo, afinal você acabou de abri-lo*/
    // fseek(arquivo, posicao, SEEK_SET);

    system("cls");
    while(fread(&ctt, sizeof(CONTATO), 1, arquivo)==1)
    {
        if(strcmp(AltCpf,ctt.cpf)==0)
        {
            printf("\n1 - Nome: %s",ctt.nome);
            printf("\n2 - CPF: %s",ctt.cpf);
            printf("\n0 - Voltar");
            printf("\n-------------\n\n");

            printf("\n\nEscolha uma opção: ");
            scanf("%d", &op);

            switch(op)
            {
                case 1:
                    fflush(stdin);
                    printf("Digite o Novo nome: ");
                    gets(ctt.nome);

                    fseek(arquivo, posicao, SEEK_SET);
                    achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO);
                    
                    /*Esse ajuste da posição é desnecessário*/
                    // ajustar posicao em relação ao inicio do arquivo
                    //posicao = posicao + sizeof(CONTATO);
                break;
                case 2:
                    fflush(stdin);
                    printf("Digite o novo CPF: ");
                    gets(ctt.cpf);

                    fseek(arquivo, posicao, SEEK_SET);
                    achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO);
                    
                    /*Novamente, esse ajuste da posição é desnecessário*/
                    // ajustar posicao em relação ao inicio do arquivo
                    //posicao = posicao + sizeof(CONTATO);
                break;

                case 0:
                    main();
                break;
                default:
                    printf("\nOpção Inválida!");
                break;
            }

        }
        /*É aqui que a posição deve ser atualizada, no final do ciclo WHILE,
        sendo descolocado de +sizeof(CONTATO) a cada iteração do ciclo*/
        posicao = posicao + sizeof(CONTATO);
    }
    fclose(arquivo);
}

 

A variável "posicao" está armazenando a posição de leitura/escrita no arquivo antes do próximo fread() ser executado (que logicamente desloca a posição a cada leitura).

Postado

@isrnick A Edição funciona sim!

Mas o while ainda continua com o erro que mencionei anteriormente:

 

Aqui mostra a lista antes da edição:

Status: 1
Nome: Edson
CPF: 041
--------------------

Status: 1
Nome: Thais
CPF: 042
--------------------

e aqui mostra a lista após a edição:

Status: 1
Nome: Edson Júnior
CPF: 041
--------------------

Status: 1
Nome: Thais
CPF: 042
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Status: 0
Nome:
CPF:
--------------------

Perceba que alterar "Edson" para "Edso Junior", porém foi armazenado no arquivo esses Status: 0 com as variaveis vazias:

Postado

@vangodp estou depurando o seu código tentando entender o que você fez, confesso que desconheço alguns dos termos utilizados por vocês.. O um deles foi ler o nome atráves do "scanf("%50[^\n]%*c", nome);"

Postado
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <locale.h>

typedef struct contato CONTATO;
struct contato
{
    int ativo;
    char nome[50];
    char cpf[30];
};
void flush_in();
void cadastrar();
void listar();
void editar();
//VARIAVEL UNIVERSAL
FILE *arquivo;
CONTATO ctt;
int op;
int main(void)
{
    setlocale(LC_ALL, "Portuguese");
    do
    {
        system("cls");
        printf("\n1 - Cadastrar");
        printf("\n2 - Listar");
        printf("\n3 - Editar");
        printf("\n0 - Sair\n\n");

        printf("Digite uma opção: ");
        scanf("%d", &op);
        //flush_in();

        switch(op)
        {
            case 1:
                cadastrar();
            break;
            case 2:
                listar();
            break;
            case 3:
                editar();
            break;
            case 0:
            break;
            default:
                printf("\nOpção Inválida!\n");
                getch();
            break;
        }

    }while(op!=0);
}
void flush_in() {
    int ch;
    
    while ( ( ch = fgetc ( stdin ) ) != '\n' && ch != EOF) {}
}
void cadastrar()
{
    flush_in();
	do
    {
        arquivo = fopen("base.txt","a+b");
        system("cls");
        printf("Nome: ");
        gets(ctt.nome);

        printf("CPF: ");
        gets(ctt.cpf);

        ctt.ativo = 1;

        fwrite(&ctt, sizeof(CONTATO),1,arquivo);
        fclose(arquivo);
        printf("Deseja realizar novo Cadastro (s/n)?");
    }while(getche()=='s');

}
void listar()
{
    system("cls");

    arquivo = fopen("base.txt","rb");

    while(fread(&ctt,sizeof(CONTATO),1,arquivo)==1)
    {
        printf("Status: %d\n", ctt.ativo);
        printf("Nome: %s\n",ctt.nome);
        printf("CPF: %s\n",ctt.cpf);
        printf("--------------------\n\n");
    }
    fclose(arquivo);
    getch();

}
void editar()
{
    int posicao = 0; // Inicio do Arquivo;
    int achou = 0;
    char AltCpf[30];
    char AltNome[50];


    flush_in();
    printf("Digite o CPF: ");
    gets(AltCpf);

    arquivo = fopen("base.txt","r+b");

    system("cls");
    op = -1;
    while(fread(&ctt, sizeof(CONTATO), 1, arquivo)==1 && op!=0)
    {
        if(strcmp(AltCpf,ctt.cpf)==0)
        {
            printf("\n1 - Nome: %s",ctt.nome);
            printf("\n2 - CPF: %s",ctt.cpf);
            printf("\n0 - Voltar");
            printf("\n-------------\n\n");

            printf("\n\nEscolha uma opção: ");
            scanf("%d", &op);
            flush_in();

            switch(op)
            {
                case 1:
                    printf("Digite o Novo nome: ");
                    gets(ctt.nome);

                    fseek(arquivo, posicao, SEEK_SET);
                    achou= fwrite(&ctt,sizeof(CONTATO),1,arquivo) == sizeof(CONTATO);
                break;
                
                case 2:
                    printf("Digite o novo CPF: ");
                    gets(ctt.cpf);

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

                case 0:
                	/*Não se deve chamar main() de dentro da função, isso criar uma recursividade
					com comportamento imprevisivel*/
                	//main();
                break;
                
                default:
                    printf("\nOpção Inválida!\n");
                    getch();
                break;
            }

        }
        /*É aqui que a posição deve ser atualizada, no final do ciclo WHILE,
        sendo descolocado de +sizeof(CONTATO) a cada iteração do ciclo*/
        posicao = posicao + sizeof(CONTATO);
        
        /*Move posição de leitura/escrita de volta para a posição original*/
        fseek(arquivo, posicao, SEEK_SET);
    }
    op=-1;
    fclose(arquivo);
}

Só faltavam alguns detalhes, adicionei um fseek() no final pra voltar a posição original após fazer a edição, e aproveitei pra retirar os fflush(stdin) e substituir pela função flush_in() conforme sugerido pelo @vangodp .

 

Mas o problema maior era que o tinha um "case" no "switch" da função onde a função main() era chamada, e isso gerava uma recursividade sem comportamento previsto, retirei isso e ao invés fiz o ciclo while checar o valor da  variável "op" e acabar quanto igual a 0... (Outra opção seria dentro do "case" usar "fclose()" pra fechar o arquivo, e "return;" pra sair da função)

Postado

 

5 horas atrás, vangodp disse:

Aqui acho que todos sabemos que é binário, essa não é a questão.

Sim, essa não é a questão, eu me referia a discussão sobre usar formato TXT ou CSV, e sobre como o caractere nova linha é representado na memória, não se aplicam no caso sendo discutido nesse tópico.

Postado

Bacana pessoal, estou desenrolando bem aqui com as dicas de vocês..

Estou dando uma lida nos tópicos do forum também.

 

Ah, qual a diferença de fflush(stdin) e fflush-in ?

Postado

fflush(stdin) tem comportamento indefinido, ou seja pode não se comportar como o esperado, isso porque fflush() é para ser usado com streams de saída, não de entrada. Dependendo de como foi implementado no seu compilador/biblioteca ele pode até funcionar para limpar a stream, mas se usar um compilador diferente pode não funcionar, então não se deve usá-lo para esta função.

 

flush_in() é uma função que o @vangodp postou/criou para fazer o que você pretendia ao usar fflush(stdin) no seu código, ou seja limpar os caracteres que ainda estiverem na entrada padrão stdin, para que não sejam interpretados como dados digitados pelo próximo comando de captura de entrada...

  • Curtir 1
Postado

@vangodp Eu estava lendo agora mesmo o link que você postou anteriormente, muita coisa me ajudou!

Fiquei com dúvida sobre o uso do get e fgets, sempre leio string com eles, e pelo que notei eles armazenam o \n, dessa forma não fica lixo no buffet, seguindo esse raciocinio não tem necessidade de limpar, estou certo?

Postado

          Eu     acho     muito     interessante     a     discussão     a     respeito     do buffer do  stream  in,
porque ela  vem de  uma    limitação    da    prompt ,    por    falta    de    imposição    de    limites    de
campos   o      que      torna     esta     discussão     tema     de   segurança   de  dados.  E  dentre  as
funções   de      capturas     de    dados     char   *  gets(char *str);    é    pouquíssimo   recomendada
seu  maior   problema   é   continuar   a   gravação   mesmos  depois  de  atingir  o limite  de memória
do veto r que foi  entregue  no  ponteiro  str.  Por   ocasião   disto,  recomenda- se  a  função  fgets  e
com   um  pouco  mais  de código  implementar  contra  futuros  bugs  ou  erros  input.  É   importante
salientar que na função char * fgets(char *str, int len, FILE *stream) "em todo input tem" um caractere
de nova linha no final; e isto não é convencional para nomes pessoais.

  • Curtir 1
Visitante
Este tópico está impedido de receber novas respostas.

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