Ler ficheiros C

Innight

Power Member
Boas pessoal.como eu fazo leitura de um ficheiro .data em C?
eu quando abro o .data com o notepad aparece ff"  ld"  fg"  .

Nao consigo o abrir em C como se fosse um notepad,mas o C consegue entender como se fosse palavras normais. Alguem sabe codigo de uma estretura para ler ficheiros binarios?
.
Cumprimentos
 
Boas. Não sei se percebi muito bem, mas se conheceres a estrutura do ficheiro .data, podes ler os seus dados (e saber o que significam) em C abrindo-o em modo de leitura e binário.
Código:
FILE *fp;

fp = fopen("ficheiro.data", "rb");

Se não conheceres a estrutura do ficheiro, podes lê-lo na mesma mas és capaz de não perceber muito. :)
 
Ainda não consegui perceber o que é que pretendes, mas pronto. Depois de abrires o ficheiro com o fopen, podes usar por exemplo o fgets e depois um printf para então ler o que está no ficheiro e mostrar. Isto é apenas um exemplo. Tens inúmeras funções em C que trabalham sobre ficheiros.
Aconselho-te leres um livro ou pesquisares um bocado para encontrares aquilo que pretendes.
 
Código:
#include <stdio.h>
#include <stdlib.h>

struct tagCursoFile
{
 char nome; 
 char descricao;
 int ciclo;
};

struct tagCursoMem
{
 char nome; 
 char descricao;
 int ciclo;
struct tagCursoMem* pNext;
};

int MainMenu();
void AddToHead(struct tagCursoMem** pAuxHead, struct tagCursoMem* pAuxNew);
//struct tagCursoMem* ProcMaisVelho(struct tagCursoMem* pAux);
void GravarFile(int nSatus, struct tagCursoMem* pAux);
void lerdados(struct tagCursoMem* pAux,struct tagCursoMem* pAuxNew);
int main()
{
int opc, nAlterado = 0, nCntAlunos = 0;
FILE* pFile;
struct tagCursoFile cursoFile;
struct tagCursoMem* pHead = NULL;
struct tagCursoMem* pNew, *pAux;
if((pFile = fopen("alunos.data", "rb")) != NULL) {
while(fread(&cursoFile, sizeof(struct tagCursoFile), 1, pFile) != 0) {
pNew = (struct tagCursoMem*)malloc(sizeof(struct tagCursoMem));
pNew->pNext = NULL;
pNew->nome = cursoFile.nome;
pNew->descricao = cursoFile.descricao;
pNew->ciclo = cursoFile.ciclo;
AddToHead(&pHead, pNew);
nCntAlunos++;
}
printf("Foram lidos %d registos", nCntAlunos);
fclose(pFile);
}
do {
opc = MainMenu();
switch(opc) {
case 1:
pNew = (struct tagCursoMem*)malloc(sizeof(struct tagCursoMem));
pNew->pNext = NULL;
printf("Indique o nome do curso:\n");
scanf("%s", &pNew->nome);
printf("Indique a descricao:\n");
scanf("%s", &pNew->descricao);
printf("Indique o ciclo:\n");
scanf("%d", &pNew->ciclo);

AddToHead(&pHead, pNew);
nAlterado = 1;
break;

case 2:
GravarFile(nAlterado, pHead);
nAlterado = 0;
break;

case 4:
  system("cls");
    
    pFile=fopen("alunos.data","r");
    int num;
    fread(&num,sizeof(int),1,pFile);
    /* read a line */      
    fclose ( pFile );
      system("pause");

   
      /* close the file */
      fclose(pFile);
   
      return 0;

break;
/*
case 3:
if(((pAux = ProcMaisVelho(pHead)) != NULL))
printf("O aluno mais velho tem o numero %d", pAux->nNumero);
break;
*/
case 0:
break;
default:
printf("Opcao invalida!");
}
}while(opc != 0);
GravarFile(nAlterado, pHead);
return 0;
}

int MainMenu()
{
int sel;
puts("\n\n1 - Inserir aluno");
puts("2 - Gravar no ficheiro");
puts("3 - Aluno mais velho");
puts("4 - Ler Alunos");
puts("\n0 - Sair");
scanf("%d", &sel);
return sel;
}

void AddToHead(struct tagCursoMem** pAuxHead, struct tagCursoMem* pAuxNew)
{
if(*pAuxHead != NULL)
pAuxNew->pNext = *pAuxHead;
*pAuxHead = pAuxNew;
}
/*
struct tagCursoMem* ProcMaisVelho(struct tagCusoMem* pAux)
{
struct tagCursoMem *pMaisVelho;
if(pAux != NULL)
pMaisVelho = pAux; // nó inicial de comparação
else
return NULL;
while(pAux != NULL) {
if(pMaisVelho->nIdade < pAux->nIdade)
pMaisVelho = pAux;
pAux = pAux->pNext;
}
return pMaisVelho;
}
*/
void GravarFile(int nStatus, struct tagCursoMem* pAux)
{
FILE* pFile;
struct tagCursoFile Curso;
if(nStatus == 1) {
if((pFile = fopen("alunos.data", "w")) != NULL) {
while(pAux != NULL) {
Curso.nome = pAux->nome;
Curso.descricao = pAux->descricao;
Curso.ciclo = pAux->ciclo;
fwrite(&Curso, sizeof(struct tagCursoFile), 1, pFile);
pAux = pAux->pNext;
}
}
fclose(pFile);
}
}

Vou exemplificar o que me falta,eu quando eu adicino um novo Curso e insero no aluno.data a informação mas a informação fica assim qunado eu leio com o notepad
"ff" ld" fg" "

ou seja o compilador le como se fosse letras normais,porque comprende binarios mas eu nao sei como eide de ler estes binarios em formata de texto para o output no ecran.ALguma ajuda?
 
Última edição pelo moderador:
Nesse código tens uns aspectos/erros a ter em atenção, que inclusivé podem-te resolver esse problema. Toma em atenção o seguinte, e repara que dei apenas uma vista de olhos rápida:
Código:
 char nome; 
 char descricao;
aqui o teu nome e descrição só podem ter um caracter. Ou seja, deverás meter algo como:
Código:
 char nome[50];
 char descricao[50];
ou então declarar apenas um ponteiro e depois fazeres um malloc. :)
Repara que tens/deves fazer free's por cada malloc que fazes.
Se abres o ficheiro em modo binário para leitura, também deves escrever em modo binário. Repara ainda que se o nome e a descrição forem de dimensão variável vais ter um problema quando fores ler do ficheiro, porque não sabes onde terminas ou começas o campo da estrutura. Tens alguma soluções para isso, é só pensares um bocado.
Verifica todas as {} e todo o código em geral para ver se bate tudo certo.

Isto são apenas alguns conselhos que te podem ajudar a descobrir o problema que estás a ter.
 
http://msdn.microsoft.com/en-us/library/yeby3zcb(vs.71).aspx

Tens uma série de combinações que podes fazer no parametro MODE

Tenta alterar pFile=fopen("alunos.data","r"); para pFile=fopen("alunos.data","rb"); no caso da leitura...
e
fopen("alunos.data", "w") para fopen("alunos.data", "wb") quando fores escrever.

tens também a opção "rt" e "wt" para text-mode se for esse o caso...

Não percebi bem a tua dúvida!
 
Back
Topo