Jump to content

Recommended Posts

Posted

Boas tenho aqui este programa que arranjei do meu professor e gostaria de saber como posso fazer a leitura do ficheiro de txt neste:

#include <stdio.h>
#include <string.h>
#define MAXSIGLA 10
#define MAX 60
/* Estrutura de ligação - INÍCIO */
struct no
{
   struct no * prox;
   struct no * ant;
   void * dados;
};
typedef struct no NO;
typedef NO * PNO;
typedef NO ** PPNO;
/* Estrutura de ligação - FIM */
/* Estruturas de dados - INÍCIO */
struct aluno
{
   int numero;
   char nome[MAX];
};
typedef struct aluno ALUNO;
typedef ALUNO * PALUNO;
struct curso
{
   char sigla[MAXSIGLA];
   char nome[MAX];
};
typedef struct curso CURSO;
typedef CURSO * PCURSO;
/* Estruturas de dados - FIM */
/* Funções para ordenação com Bubblesort - INÍCIO */
int nomeCres(PALUNO a, PALUNO b)
{
   if(strcmp(a->nome, b->nome) > 0) return 1;
   else return 0;
}
int nomeDecr(PALUNO a, PALUNO b)
{
   if(strcmp(a->nome, b->nome) < 0) return 1;
   else return 0;
}
int numCres(PALUNO a, PALUNO b)
{
   if(a->numero > b->numero) return 1;
   else return 0;
}
int numDecr(PALUNO a, PALUNO b)
{
   if(a->numero < b->numero) return 1;
   else return 0;
}
int conta(PNO cabeca)
{
   PNO ptr;
   int cont=0;
   for (ptr=cabeca; ptr; ptr=ptr->prox) cont++;
   return cont;
}
/** Ordena com bubblesort */
void bubblesort (PNO cabeca, int (*compara)())
{
   PNO ptr;
   void * tmp;
   int i, tam = conta(cabeca);
   for(i=0; i<tam; i++)
   {
    for(ptr=cabeca; ptr->prox; ptr=ptr->prox)
    {
	    if((*compara)(ptr->dados, ptr->prox->dados))
	    {
		    tmp = ptr->dados;
		    ptr->dados = ptr->prox->dados;
		    ptr->prox->dados = tmp;
	    }
    }
   }
}
/* Funções para ordenação com Bubblesort - FIM */
/* Criar aluno */
PALUNO criarAluno()
{
   PALUNO ptr;
   ptr = (PALUNO) malloc(sizeof(ALUNO));
   printf("Numero: ");
   scanf("%d", &ptr->numero);
   printf("Nome: ");
   rewind(stdin);
   fgets(ptr->nome, MAX, stdin);
   /* Tirar o '\n' do fim do nome */
   ptr->nome[strlen(ptr->nome)-1] = '\0';
   return ptr;
}
/* Criar curso */
PCURSO criarCurso()
{
   PCURSO ptr;
   ptr = (PCURSO) malloc(sizeof(CURSO));
   printf("Sigla: ");
   rewind(stdin);
   fgets(ptr->sigla, MAXSIGLA, stdin);
   /* Tirar o '\n' do fim da sigla */
   ptr->sigla[strlen(ptr->sigla)-1] = '\0';
   printf("Nome: ");
   fgets(ptr->nome, MAX, stdin);
   /* Tirar o '\n' do fim do nome */
   ptr->nome[strlen(ptr->nome)-1] = '\0';
   return ptr;
}
/* Inserir à cabeça */
void insCab (PPNO cabeca, void* p)
{
   PNO ptr;
   ptr = (PNO) malloc(sizeof(NO));
   if(*cabeca) (*cabeca)->ant = ptr;
   ptr->prox = *cabeca;
   ptr->ant = NULL;
   *cabeca = ptr;
   ptr->dados = p;
}
void imprime(PNO cabeca, void (*imprimeDados)())
{
   PNO ptr;
   for (ptr=cabeca; ptr; ptr=ptr->prox)
   {
    (*imprimeDados)(ptr->dados);
   }
}
void imprimeAluno(PALUNO p)
{
   printf("%d - %s\n", p->numero, p->nome);
}
void imprimeCurso(PCURSO p)
{
   printf("%s - %s\n", p->sigla, p->nome);
}
void escreveAlunos(FILE *fp, PNO cabeca)
{
   PNO ptr;
   int tam = conta(cabeca);
   fprintf(fp, "%d\n", tam);
   for (ptr=cabeca; ptr; ptr=ptr->prox)
   {
    fprintf(fp, "%d\n", ((PALUNO)ptr->dados)->numero);
    fprintf(fp, "%s\n", ((PALUNO)ptr->dados)->nome);
   }
}
void escreveCursos(FILE *fp, PNO cabeca)
{
   PNO ptr;
   int tam = conta(cabeca);
   fprintf(fp, "%d\n", tam);
   for (ptr=cabeca; ptr; ptr=ptr->prox)
   {
    fprintf(fp, "%s\n", ((PCURSO)ptr->dados)->sigla);
    fprintf(fp, "%s\n", ((PCURSO)ptr->dados)->nome);
   }
}

int main()
{
   PNO alunos=NULL, cursos=NULL;
   int opcao;
   void * ptr;
   FILE * fp;
   while(1)
   {
    printf("\n\nListas em Memoria\n");
    printf("\n1 - Inserir aluno a cabeca");
    printf("\n2 - Imprimir lista de alunos");
    printf("\n3 - Inserir curso a cabeca");
    printf("\n4 - Imprimir lista de cursos");
    printf("\n5 - Ordenar alunos por nome (crescente)");
    printf("\n6 - Ordenar alunos por nome (decrescente)");
    printf("\n7 - Ordenar alunos por numero (crescente)");
    printf("\n8 - Ordenar alunos por numero (decrescente)");
    printf("\n9 - Guardar em ficheiro");
    printf("\na - Ler de ficheiro");
    printf("\n0 - Sair");
    printf("\n\nInsira opcao: ");
    rewind(stdin);
    opcao = getchar();
    switch(opcao)
    {
    case '1':
	    ptr = criarAluno();
	    insCab(&alunos,ptr);
	    break;
    case '2':
	    imprime(alunos, imprimeAluno);
	    break;
    case '3':
	    ptr = criarCurso();
	    insCab(&cursos,ptr);
	    break;
    case '4':
	    imprime(cursos, imprimeCurso);
	    break;
    case '5':
	    bubblesort(alunos, nomeCres);
	    break;
    case '6':
	    bubblesort(alunos, nomeDecr);
	    break;
    case '7':
	    bubblesort(alunos, numCres);
	    break;
    case '8':
	    bubblesort(alunos, numDecr);
	    break;
    case '9':
	    fp = fopen("dados.txt", "w");
	    escreveAlunos(fp, alunos);
	    escreveCursos(fp, cursos);
	    //fclose(fp);
	    break;
    case 'a':
	    break;
    case '0':
	    fclose(fp);
	    return;
    }
   }
}

E para o de binario aqui neste:

#include <stdio.h>
#include <string.h>
#define MAXSIGLA 10
#define MAX 60
/* Estrutura de ligação - INÍCIO */
struct no
{
   struct no * prox;
   struct no * ant;
   void * dados;
};
typedef struct no NO;
typedef NO * PNO;
typedef NO ** PPNO;
/* Estrutura de ligação - FIM */
/* Estruturas de dados - INÍCIO */
struct aluno
{
   int numero;
   char nome[MAX];
};
typedef struct aluno ALUNO;
typedef ALUNO * PALUNO;
struct curso
{
   char sigla[MAXSIGLA];
   char nome[MAX];
};
typedef struct curso CURSO;
typedef CURSO * PCURSO;
/* Estruturas de dados - FIM */
/* Funções para ordenação com Bubblesort - INÍCIO */
int nomeCres(PALUNO a, PALUNO b)
{
   if(strcmp(a->nome, b->nome) > 0) return 1;
   else return 0;
}
int nomeDecr(PALUNO a, PALUNO b)
{
   if(strcmp(a->nome, b->nome) < 0) return 1;
   else return 0;
}
int numCres(PALUNO a, PALUNO b)
{
   if(a->numero > b->numero) return 1;
   else return 0;
}
int numDecr(PALUNO a, PALUNO b)
{
   if(a->numero < b->numero) return 1;
   else return 0;
}
int conta(PNO cabeca)
{
   PNO ptr;
   int cont=0;
   for (ptr=cabeca; ptr; ptr=ptr->prox) cont++;
   return cont;
}
/** Ordena com bubblesort */
void bubblesort (PNO cabeca, int (*compara)())
{
   PNO ptr;
   void * tmp;
   int i, tam = conta(cabeca);
   for(i=0; i<tam; i++)
   {
    for(ptr=cabeca; ptr->prox; ptr=ptr->prox)
    {
	    if((*compara)(ptr->dados, ptr->prox->dados))
	    {
		    tmp = ptr->dados;
		    ptr->dados = ptr->prox->dados;
		    ptr->prox->dados = tmp;
	    }
    }
   }
}
/* Funções para ordenação com Bubblesort - FIM */
/* Criar aluno */
PALUNO criarAluno()
{
   PALUNO ptr;
   ptr = (PALUNO) malloc(sizeof(ALUNO));
   printf("Numero: ");
   scanf("%d", &ptr->numero);
   printf("Nome: ");
   rewind(stdin);
   fgets(ptr->nome, MAX, stdin);
   /* Tirar o '\n' do fim do nome */
   ptr->nome[strlen(ptr->nome)-1] = '\0';
   return ptr;
}
/* Criar curso */
PCURSO criarCurso()
{
   PCURSO ptr;
   ptr = (PCURSO) malloc(sizeof(CURSO));
   printf("Sigla: ");
   rewind(stdin);
   fgets(ptr->sigla, MAXSIGLA, stdin);
   /* Tirar o '\n' do fim da sigla */
   ptr->sigla[strlen(ptr->sigla)-1] = '\0';
   printf("Nome: ");
   fgets(ptr->nome, MAX, stdin);
   /* Tirar o '\n' do fim do nome */
   ptr->nome[strlen(ptr->nome)-1] = '\0';
   return ptr;
}
/* Inserir à cabeça */
void insCab (PPNO cabeca, void* p)
{
   PNO ptr;
   ptr = (PNO) malloc(sizeof(NO));
   if(*cabeca) (*cabeca)->ant = ptr;
   ptr->prox = *cabeca;
   ptr->ant = NULL;
   *cabeca = ptr;
   ptr->dados = p;
}
void imprime(PNO cabeca, void (*imprimeDados)())
{
   PNO ptr;
   for (ptr=cabeca; ptr; ptr=ptr->prox)
   {
    (*imprimeDados)(ptr->dados);
   }
}
void imprimeAluno(PALUNO p)
{
   printf("%d - %s\n", p->numero, p->nome);
}
void imprimeCurso(PCURSO p)
{
   printf("%s - %s\n", p->sigla, p->nome);
}
void escreve(FILE *fp, PNO cabeca, int tamanho)
{
   PNO ptr;
   int n = conta(cabeca);
   fwrite(&n, sizeof(int), 1, fp);
   for (ptr=cabeca; ptr; ptr=ptr->prox)
   {
    fwrite(ptr->dados, tamanho, 1, fp);
   }
}
int main()
{
   PNO alunos=NULL, cursos=NULL;
   int opcao;
   void * ptr;
   FILE * fp;
   while(1)
   {
    printf("\n\nListas em Memoria\n");
    printf("\n1 - Inserir aluno a cabeca");
    printf("\n2 - Imprimir lista de alunos");
    printf("\n3 - Inserir curso a cabeca");
    printf("\n4 - Imprimir lista de cursos");
    printf("\n5 - Ordenar alunos por nome (crescente)");
    printf("\n6 - Ordenar alunos por nome (decrescente)");
    printf("\n7 - Ordenar alunos por numero (crescente)");
    printf("\n8 - Ordenar alunos por numero (decrescente)");
    printf("\n9 - Guardar em ficheiro");
    printf("\na - Ler de ficheiro");
    printf("\n0 - Sair");
    printf("\n\nInsira opcao: ");
    rewind(stdin);
    opcao = getchar();
    switch(opcao)
    {
    case '1':
	    ptr = criarAluno();
	    insCab(&alunos,ptr);
	    break;
    case '2':
	    imprime(alunos, imprimeAluno);
	    break;
    case '3':
	    ptr = criarCurso();
	    insCab(&cursos,ptr);
	    break;
    case '4':
	    imprime(cursos, imprimeCurso);
	    break;
    case '5':
	    bubblesort(alunos, nomeCres);
	    break;
    case '6':
	    bubblesort(alunos, nomeDecr);
	    break;
    case '7':
	    bubblesort(alunos, numCres);
	    break;
    case '8':
	    bubblesort(alunos, numDecr);
	    break;
    case '9':
	    fp = fopen("dados.bin", "wb");
	    escreve(fp, alunos, sizeof(ALUNO));
	    escreve(fp, cursos, sizeof(CURSO));
	    fclose(fp);
	    break;
    case 'a':
	    break;
    case '0':
	    return;
    }
   }
}
Posted

ora bem ... estás a dizer então que tens um trabalho para fazer e não sabes fazer ...

a única coisa que te posso dizer (não vou por nenhuma linha de código, porque acho que devias estudar) é

para tratamento de ficheiros

- http://www.cplusplus.com/reference/clibrary/cstdio/fclose/

- http://www.cplusplus.com/reference/clibrary/cstdio/feof/

- http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

para ficheiros de texto lê:

- http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

- http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/

ou

- http://www.cplusplus.com/reference/clibrary/cstdio/fscanf (se o ficheiro for bem formatado)

para ficheiros binários lê:

- http://www.cplusplus.com/reference/clibrary/cstdio/fread/

isto é somente para leitura porque parece que já tens código para escrita

IRC : sim, é algo que ainda existe >> #p@p
Posted

quer dizer nao aprendeste nada com o teu antigo post???

https://www.portugal-a-programar.pt/topic/54031-de-ficheiro-binario-para-struct/

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.