davide92 Posted June 6, 2012 at 09:31 PM Report #461089 Posted June 6, 2012 at 09:31 PM 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; } } }
HappyHippyHippo Posted June 6, 2012 at 09:47 PM Report #461092 Posted June 6, 2012 at 09:47 PM leste o código ? testaste o código ? qual é mesmo a tua dúvida ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
davide92 Posted June 6, 2012 at 09:59 PM Author Report #461100 Posted June 6, 2012 at 09:59 PM Li e testei a minha duvida é pôr o codigo de cima a ler do ficheiro txt e o codigo de baixo a ler do ficheiro bin
HappyHippyHippo Posted June 6, 2012 at 10:15 PM Report #461112 Posted June 6, 2012 at 10:15 PM 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 Portugol Plus
davide92 Posted June 6, 2012 at 10:24 PM Author Report #461115 Posted June 6, 2012 at 10:24 PM Sim sim o codigo para a escrita já o fiz.
pikax Posted June 7, 2012 at 02:11 AM Report #461139 Posted June 7, 2012 at 02:11 AM 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."
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now