• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

kAIOSHIN

Trabalhar com ficheiros

6 mensagens neste tópico

Boas...

Estou a começar a mexer com ficheiros em C.

O meu objectivo é escrever no ficheiro o numero do aluno, o nome e a nota, verificando se o número já foi introduzido.

Como posso comparar o número introduzido com os números que já estao no ficheiro? No código que escrevi, o programa compara como se fosse uma string, mas penso que procura no ficheiro todo...Se a nota for igual ao número ele vai dizer que já está introduzido esse aluno. Como posso procurar só na primeira "coluna"?

O código que escrevi até agora é o que se segue:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define eoln {while(getchar() != '\n') {;}}

typedef struct aluno{
    
    char numero[6];
    char nome[30];
    int nota;
}ALUNO;

void adiciona_alunos(FILE *fp){
    
    ALUNO iname, outname;
    int i=0,j=0;
    
    /* Abrir o ficheiro */
    
    fp = fopen("alunos.txt","a+");
    
    /* Verificar se a abertura foi feita com sucesso: */
    
    if (fp == NULL)
        printf("Impossivel abrir o ficheiro 'alunos.txt'\n");
    else{
        printf("Ficheiro 'alunos.txt' aberto com sucesso!!!\n");
    }
    
    printf("Qual o numero do aluno?\n");
    scanf("%s", iname.numero);
    
    while(fgets(outname.numero,(strlen(iname.numero))+1,fp) != NULL)
        if(strcmp(iname.numero,outname.numero)==0){
            printf("Esse aluno ja existe! \n");
            i=1;
        }    

    if(i==0){
    printf("Qual o nome do aluno?\n");
    scanf("%s", iname.nome);
    
    printf("Qual a nota do aluno?\n");
    scanf("%d", &iname.nota);
    
    printf("\n\nNome introduzido no sistema com sucesso!\n\n");
    fprintf(fp,"%s %s %d\n",iname.numero, iname.nome, iname.nota);
    }
    
    fclose(fp);
}
    
    
int main(){

    FILE *fp;
    adiciona_alunos(fp);

return(0);

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vi o código por alto mas toma em atenção que o fgets lê o '\n'.

Se comparares sem retirar o '\n' do fim nunca vai ser igual. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podes usar o 'fscanf' em vez do 'fgets'.

fscanf(fp,"%s %*[^\n]",&outname.numero);

experimenta isto.

duas observações:

- por que é que usas strings para representar inteiros?

- podias estar a usar ficheiros binários, o que facilitava a leitura dos ficheiros (não é que assim seja muito complicado).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podes usar o 'fscanf' em vez do 'fgets'.

fscanf(fp,"%s %*[^\n]",&outname.numero);

experimenta isto.

duas observações:

- por que é que usas strings para representar inteiros?

- podias estar a usar ficheiros binários, o que facilitava a leitura dos ficheiros (não é que assim seja muito complicado).

- Estava a usar strings, porque nao tava a ver outra maneira de fazer o ciclo (ou seja com inteiros).

Agora já funciona, usando a funçao que disseste. Fiz o seguinte:

 while((fscanf(fp,"%d %*[^\n]",&outname.numero)) != EOF)
        if(iname.numero==outname.numero){
            printf("Esse aluno ja existe! \n");
            i=1;
        }    

Penso que é assim, mas nao sei se é correcto. Pelo menos parece que funciona. Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora