Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void remover_newline(char *);

struct dados {
	char matricula[5];
	char nome[40];
	char curso[20];
	char nota[2];
} aluno;

int main(void)
{
	char linha[40];
	FILE *dados;
	
	
	
	dados = fopen("dados.txt", "r");
	if(dados == NULL){
		printf("dados.txt - arquivo desconhecido\n");
		getchar();
		exit(1);
	}

	while(fgets(linha, sizeof(linha), dados) != NULL){
		
		remover_newline(linha);
		strcpy(aluno.matricula, linha);

		fgets(linha, sizeof(linha), dados);
		remover_newline(linha);
		strcpy(aluno.nome, linha);

		fgets(linha, sizeof(linha), dados);
		remover_newline(linha);
		strcpy(aluno.curso, linha);

		fgets(linha, sizeof(linha), dados);
		remover_newline(linha);
		strcpy(aluno.nota, linha);

		printf("aluno.matricula: %s\n", aluno.matricula);
		printf("aluno.nome: %s\n", aluno.nome);
		printf("aluno.curso: %s\n", aluno.curso);
		printf("aluno.nota: %s\n\n", aluno.nota);

		break;
	}

	fclose(dados);

	return 0;
}

void remover_newline(char *linha)
{
	char *ptr;

	ptr = strchr(linha, '\n');
	if(ptr != NULL)
		*ptr = '\0';
}
dados.txt:
Code:
20457
Denis Rocha da Silva
Linguagem de programação
{5} {40} {20} {2}

98364
Tom Hanks
Teatro
{38} {42} {2} {27}

44078
Nicolas Cage
História
{11} {29} {5} {37}

10904
Sabrina da Silva Sauro
Matemática
{3} {43} {11} {18}

12003
Charles Petzold
Programação
{34} {23} {12} {1}
The output:
Code:
aluno.matricula: 20457Denis Rocha da Silva
aluno.nome: Denis Rocha da Silva
aluno.curso: Linguagem de program{5} {40} {20} {2}
aluno.nota: {5} {40} {20} {2}
I've been trying to fix this for a long time and it is driving me crazy. What am I doing wrong? I also have this strange feeling that there is a better way to do this. Help please.