função de ponteiro de string

13. Re: função de ponteiro de string

Daniel
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






  


14. Re: função de ponteiro de string

Francisco Souza
franciscosouza

(usa Ubuntu)

Enviado em 16/10/2007 - 14:38h

O retorno da função seria esse mesmo.

code0, no seu código há algo não aconselhável, você redefiniu um tipo como uma constante.

FILE é um struct, um "tipo definido pelo usuário", e você está redefinindo como constante. Funciona, mas não é aconselhável.

E uma dúvida, o que faz a função bzero?


15. Re: função de ponteiro de string

Daniel
code0

(usa Slackware)

Enviado em 16/10/2007 - 15:34h

Tem razao, FILE e a struct utilizada pelo comando fopen; pelo header stdio.h. Eu utilizei apenas como macro para facilitar as coisas.
man bzero
bzero - write zero bytes
bzero(void *s,size_t n);
The bzero() function sets the first n bytes of the byte area starting at s to zero.

Ou seja:
char *t;
t=malloc(1024*sizeof(char));
bzero(t,1024*sizeof(char));

vai preencher completamente a matriz t com zeros.



16. Le um linha do arquivo

Paulo Marcelo Martins Toledo
paulomar

(usa Fedora)

Enviado em 16/10/2007 - 16:55h

Este código le o arquivo até encontrar a 1 linha, é para tentar ajuda-lo .
#include <stdio.h>
char* getfilec(char *texto) {
FILE *arquivo;
int i=0;
arquivo = fopen("/root/tmp","r");

while(!feof(arquivo) && (texto[i-1]!='\n')){ //le até encontrar a 1 linha
texto[i++] = fgetc(arquivo);
}
fclose(arquivo);
texto[i-1]='{TTEXTO}'; //troca o \n pelo '{TTEXTO}' de final de string
return(texto); //retorna o vetor
}

int main() {
char texto[200];
getfilec(texto);
printf("\n texto = %s ",texto);
}
Ainda não está completo pois não deu tempo, a idéia seria de passar a quantidade de "bytes" a ser lido..


17. Re: função de ponteiro de string

Daniel
code0

(usa Slackware)

Enviado em 16/10/2007 - 17:19h

paulomar, o seu codigo tem um problema de seguranca bastante grave.
Em main() você declarou:
char texto[200];

O codigo correspondente a leitura esta procurando pelo final do arquivo ou pela quebra de linha:

while(!feof(arquivo) && (texto[i-1]!='\n'))
{ //le até encontrar a 1 linha
texto[i++] = fgetc(arquivo);
}

Ok. Entao temos um arquivo sendo lido byte a byte para uma matriz de 200 posicoes ate o final do arquivo ou ate encontrar o \n. Se o meu arquivo tiver uma linha com mais de 200 caracteres, buffer overflow.
[]'s



18. Re: função de ponteiro de string

Francisco Souza
franciscosouza

(usa Ubuntu)

Enviado em 16/10/2007 - 18:05h

Interessante, code0. Não conhecia.


19. psé

Victor Guimarães Nunes
nunesvictor

(usa Ubuntu)

Enviado em 16/10/2007 - 20:09h

retornar vetor eu tb sei...
issu q me ferra, o buffer overflow, teria q alocar dinamicamente, mas sempre da segmentation fault

=/


20. Re: função de ponteiro de string

Francisco Souza
franciscosouza

(usa Ubuntu)

Enviado em 20/10/2007 - 14:29h

malloc e calloc servem justamente para "alocação dinâmica"



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts