Ir para conteúdo

Arquivado

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

KIKOLOPES90

programa em C

Recommended Posts

Há um problema que eu não consigo fazer no código, meto os três números e o programa guarda, depois escolho o número que está na segunda linha e altero o numero mas o programa guarda sempre o primeiro ou o inicio nunca o que esta na segunda linha. Eu não sei o que fazer... procurar na net é mais complicado. Espero que me ajudem.

 

Já tentei muitas vezes e não consigo entender... procurei a net todo lado como se faz tipo de alterar é muito confuso os codigos são diferentes do que meu e não conheço

 

Este é o codigo que eu tenho, é pequeno um resumo, tem "inserir alunos" e "rename alunos"

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> // bilbioteca de entrada e saida
#include <string.h> // biblioteca de tratamento de strings
#include <stdlib.h>

FILE *ficheiro;
char *alunos_ficheiro = "alunos.txt";

struct alunos
{
    char num[10];
} Alunos;

int main()
{
    int opcaoAlunos;
    printf("1 - Inserir aluno\n");
    printf("2 - Alterar alunos\n");
    printf("\nSelecione uma opcao: ");
    scanf("%d", &opcaoAlunos);
    switch (opcaoAlunos)
    {
    case 1:
        escreverAlunos();
        break;
    case 2:
        renameAlunos();
        break;
    default:
        printf("\nIncorrecto! ");
        system("pause");
        break;
    }
    exit(0);
}

int abrirFicheiroAlunos(char tipo[3])
{
    // abrir o ficheiro
    if ((ficheiro = fopen(alunos_ficheiro, tipo)) == NULL)
    {
        system("cls");
        printf("=============== Aviso ficheiro ===============\n");
        printf("\nNao existe o ficheiro do alunos! Tens de criar o aluno...\n\n");
        system("pause");
        return main();
    }
}

int escreverAlunos()
{
    system("cls");
    char opcaoInserir;
    do
    {
        system("cls");
        fflush(stdin);
        // menu inserir alunos
        printf("=============== Inserir alunos ===============\n");

        // criar um novo aluno se sim ou nao
        printf("\nCriar um novo aluno? ");
        printf("s? n? ");
        scanf("%c", &opcaoInserir);
        switch (opcaoInserir)
        {
        case 's':
        case 'S':
            abrirFicheiroAlunos("ab+"); // ab+
            // numero mecanografico
            printf("\nDigite o seu numero do aluno: ");
            fflush(stdin);
            gets(Alunos.num, 10, stdin);
            // gravar do ficheiro
            fwrite(&Alunos, sizeof(struct alunos), 1, ficheiro);
            // fechar o ficheiro
            fclose(ficheiro);
            break;
        case 'n':
        case 'N':
            break;
        default:
            printf("\nIncorrecto! ");
            system("Pause");
            break;
        }
    } while (opcaoInserir != 'n' && opcaoInserir != 'N');
}

int renameAlunos()
{
    abrirFicheiroAlunos("r+b");

    char pesquisarNumero[50];
    int opcaoRename, gravado = 0;
    int posicao = 0; // inicio do arquivo

    // usar fseek para ir ao inicio do arquivo pois
    // voce pode estar adiante do registro que quer alterar
    // usar rewind ou fseek para ir ao inicio do arquivo para nao correr risco de estar na frente do arquivo que quer alterar
    fseek(ficheiro, posicao, SEEK_SET); // ou funçao rewind(ficheiro);

    system("cls");
    // menu alterar alunos
    printf("=============== Alterar Alunos ===============\n");

    // pesquisar alunos por numero
    printf("\nDigite o numero do aluno que deseja pesquisar: ");
    fflush(stdin);
    gets(pesquisarNumero);
    rewind(ficheiro);

    do
    {
        fread(&Alunos, sizeof(struct alunos), 1, ficheiro);
        if (strcmp(pesquisarNumero, Alunos.num) == 0)
        {
            do
            {
                // menu pesquisar aluno
                printf("\n=============================================");
                printf("\nNumero: %s", Alunos.num);
                printf("\n=============================================\n");

                // menu alterar alunos
                printf("\nEscolha o numero da opcao que deseja modificar:\n");
                printf("1 - Numero do aluno\n");
                printf("0 - Terminar alterar\n");
                printf("\nSelecione uma opcao: ");
                scanf("%d", &opcaoRename);
                switch (opcaoRename)
                {
                case 1:
                    system("cls");
                    printf("=============== Alterar Alunos ===============\n");
                    printf("\nO seu antigo numero do aluno: %s", Alunos.num);
                    printf("\nDigite o seu novo numero do aluno: ");
                    fflush(stdin);
                    gets(Alunos.num, 10, stdin);
                    gravado = 1;
                    fseek(ficheiro, Alunos.num, SEEK_SET);
                    break;
                case 0:
                    break;
                default:
                    printf("\nIncorrecto! ");
                    system("Pause");
                    break;
                }
            } while (opcaoRename != 0);
        }
    } while (opcaoRename != 0);
    fseek(ficheiro, posicao, SEEK_SET);

    // ajustar posicao em relacao ao inicio do arquivo
    posicao = posicao + sizeof(struct alunos);

    // gravar do ficheiro
    fwrite(&Alunos, sizeof(struct alunos), 1, ficheiro) == sizeof(struct alunos);

    // fechar o ficheiro
    fclose(ficheiro);

    if (gravado != 0)
    {
        printf("\n\t> > > Aluno gravado com sucesso! < < <\n\n");
        system("pause");
    }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

return main();

Sério. Refaça isso. Stack overflow em dois tempos... Se quiser fazer um loop de menu, use um while no main ao invés de ficar chamando o main em outras funções.

fflush(stdin);

fflush não é p/ ser usado em entrada padrão. Leia o tópico fixo.

 

gets(pesquisarNumero);

Não use gets. Leia o tópico fixo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado _Isis_!!

 

Só mais uma dúvida! Não sei como apagar só um aluno... Por exemplo, tendo 3 alunos registados, escolher um deles e apagar o seu registo. Consigo apagar todos, mas apenas um não consigo... O que é que tenho de fazer para conseguir??

int removerAlunos()
{
	system("cls");

	char pesquisarNumero[10];
	int opcaoRemover;
	Pesquisar.achou;

	do
	{
		system("cls");
		abrirFicheiroAlunos("rb");
		// menu remover alunos
		printf("=============== Remover Alunos ===============\n\n");
		printf("1 - Eliminar aluno\n");
		printf("2 - Eliminar tudo alunos\n");
		printf("0 - Menu anterior\n");
		printf("\nSelecione uma opcao: ");
		scanf("%d", &opcaoRemover);
		switch (opcaoRemover)
		{
		case 0:
			// menu anterior
			break;
		case 1:
			system("cls");
			// menu remover alunos
			printf("=============== Remover Alunos ===============\n");
			pesquisarAlunosNumero(Pesquisar.achou, Pesquisar.opcao = 0);
			if (Pesquisar.achou == 0)
			{
				printf("\nTens a certeza eliminar o aluno? s? n? ");
				fflush(stdin);
				scanf("%c", &opcaoRemover);
				switch (opcaoRemover)
				{
				case 's':
				case 'S':
					// ?????????
					printf("\nEliminado aluno com sucesso!\n\n");
					system("pause");
					break;
				case 'n':
				case 'N':
					break;
				default:
					printf("\nIncorrecto! ");
					system("pause");
					break;
				}
				return 0;
			}
			break;
		case 2:
			do
			{
				system("cls");
				// menu remover alunos
				printf("=============== Remover Alunos ===============\n");
				printf("\nTens a certeza eliminar todos os alunos? s? n? ");
				fflush(stdin);
                                scanf("%c", &opcaoRemover);
				switch (opcaoRemover)
				{
				case 's':
				case 'S':
					// ?????????
					printf("\nEliminado tudo alunos com sucesso!\n\n");
					system("pause");
					break;
				case 'n':
				case 'N':
					break;
				default:
					printf("\nIncorrecto! ");
					system("pause");
					break;
				}
			} while ((opcaoRemover != 'n' && opcaoRemover != 'N') && (opcaoRemover != 's' && opcaoRemover != 'S'));
			break;
		default:
			printf("\nIncorrecto! ");
			system("pause");
			break;
		}
	} while (opcaoRemover != 0);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá. Sobre a sua dúvida de como remover um aluno, você pode fazer da seguinte forma:

Jogue todos os dados do arquivo pra um vetor, peça pra o usuário escolher qual aluno ele quer remover, crie outro arquivo substituindo o existente e jogue os dados do vetor pra o novo arquivo, só que, com uma condição, jogar todos os valores menos o escolhido. Assim o aluno escolhido será "removido", na verdade, ele só não será copiado pra o novo arquivo.

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.