code0
(usa Slackware)
Enviado em 16/10/2007 - 11:02h
Vamos la, tentar criar a funcao getfilec():
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fnttl.h>
char *getfilec(char *fname);
#define FILE "arquivo.txt"
int main(void) {
char *buffer; // para ler o arquivo
buffer=getfilec(FILE); // tenta ler o arquivo
if(*buffer==null) { // testa erro
fprintf(stderr,"getfilec falhou\n"); // informa erro
return -1; // sai
}
// manipule buffer como quiser
free(buffer); // libera memoria alocada
return 0;
}
// Le um arquivo
// Retorna matriz char com bytes lidos
// E de responsabilidade da funcao "chamadora"
// liberar a memoria alocada
char *getfilec(char *fname) {
struct stat stt; // status do arquivo
int fd; // descritor de arquivo
char *bytes; // buffer para bytes lidos
if(stat(FILE,&stt)==-1) { // tenta ler status
perror("stat"); // erro - informa
return 0; // retorna erro
}
bytes=malloc(stt.off_t+1); // aloca memoria
fd=open(fname,O_RDONLY); // abre o arquivo
if(fd==-1 || bytes==null) { // nao alocou memoria ou nao abriu arquivo ?
perror("ops"); // informa erro
return 0; // retorna erro
}
bzero(bytes,sizeof(bytes)); // zera o buffer
read(fd,bytes,stt.off_t); // le o tamanho do arquivo
close(fd); // fecha o arquivo
return bytes; // retorna ponteiro para o buffer
}
Sobre o malloc e o free, para facilitar as coisas veja o seguinte:
char b[1024];
char c=malloc(sizeof(char)*1024);
As matrizes b e c tem as mesmas dimensoes, a diferenca e que a matriz c necessita do comando free para liberar o espaco alocado, enquanto a matriz b e liberada automaticamente. Para indexar alguma de suas posicoes o procedimento e o mesmo para ambas, atravez de indice ou de operacao com ponteiro. Igualzinho:
b[5]=1;
c[5]=1;
Ou
*(b+5)=1;
*(c+5)=1;
Talvez eu esteja complicando um pouco, mas com a pratica vc vai ver que e extremamente simples.
Qualquer coisa posta ae.
[]'s