Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: loxo en 19 de Enero de 2003, 09:10:53 PM

Título: problemas con malloc
Publicado por: loxo en 19 de Enero de 2003, 09:10:53 PM
                                Buenas , acudo a vosotros con la siguente duda ;

quiero leer caracter a caracter para ir acumulandolo en una zona de memoria de tal manera que haga algo asi ;

l o x o <-- leido caracter a caracter desde un fichero de texto
pues en la variable de memoria quiero que se meta loxo , para despues compararla con otra por ejemplo , no consigo entender el asunto ?(

Gracias                                
Título: problemas con malloc
Publicado por: Mars Attacks en 19 de Enero de 2003, 09:34:38 PM
                                Emmm... ¿qué?¿Para qué quieres el malloc para eso?
haces un fread llamando a la variable y el número de carácteres que quieres leer y luego con strcmp(variable,cadenaconlaquecomparas) ya tienes si son iguales o no.
No sé, da algún dato más de qué quieres hacer exactamente...                                
Título: mi intencion es hacer un parser , pero estoy nublado
Publicado por: loxo en 19 de Enero de 2003, 09:46:35 PM
                                pues eso , que no doy el como comparar las palabras del fichero, y me resulta agotador por que no le veo solucion , si a ser posible, me dais respuesta sobre mi codigo me hariais un gran favor .

#include
#include

/* Variables */
FILE *ficheroPar;
char buffer;
char _igual='=';
char *preservadas=NULL;
int i;

int i;
int main(int argc, char *argv[1])
{

/* Abre el fichero con el nombre pasado por el argv[1] */
/* ejm par.exe par.txt */
/* si el fichero que se intenta abrir no existe deveuelve un mensaje de error */
/* y sale del la ejecucion del programa */
ficheroPar=fopen(argv[1],"rb");
if(ficheroPar==NULL) { printf("Error : el fichero %s no se puede abrir",argv[1]);exit(1);}
/* ahora toca leer caracter por caracter */
/* aqui empieza a leer hasta el final del fichero */
preservadas=(char*)malloc(4096);
while(!feof(ficheroPar)){
buffer=getc(ficheroPar);
preservadas+=buffer;   


if(buffer==_igual) { analiza(i); }
printf("%c",preservadas[0]);
}
fclose(ficheroPar);


/* aqui lee caracter por caracter y lo mete en una variable en memoria */
/* si el caracter leido es un simbolo ,compara la palabra que esta en memoria con las definidas por el lenguje */
/* si existe la traduce como tal , si no , no hace nada por ahora */
/* por ultimo cerramos el fichero */


return 0;
 
}

int analiza(int x)
{

char buf[81];
char var;
int in;
fread(buf,sizeof(char),4,preservadas);
printf("%c",buf);
}                                
Título: problemas con malloc
Publicado por: fiero en 19 de Enero de 2003, 10:16:02 PM
                                preservadas+=buffer;

¿Estás incrementando un puntero con el valor de un caracter  :o ?

quizás lo que quieras hacer sea esto:

i=0;
while(!feof(ficheroPar)){
buffer=getc(ficheroPar);
preservadas=buffer;
i++;

¿Para que defines i si luego no la usas?

Con la función analiza() no sé muy bien lo que quieres hacer, explicalo un poco si puedes.

un saludo

PD: No olvides liberar la memoria antes de salir:

free(preservadas);
return 0;

}                                
Título: problemas con malloc
Publicado por: loxo en 19 de Enero de 2003, 10:46:32 PM
                                mi intencion es hacer un parser que cuando lea una palabra de un texto sea capaz dee cambiarla por otra                                
Título: problemas con malloc
Publicado por: nostromo en 19 de Enero de 2003, 10:49:02 PM
                                Holas,

creo que necesitas mirarte algún manual de C sobre todo el tema de punteros, arrays, cadenas terminadas en 0 etc

El codigo que te ha apuntado fiero yo tambien pienso que es lo que querias hacer. Te apunto un poco lo que quiere decir cada cosa para que te aclares con este tema(aunque eso no quita que necesites echarle un vistazo o tres al manual de C ).

1. getc deberia ser  fgetc
Esta función lee un caracter(un char) que haciendo buffer = fgetc(ficheroPar) consigues leer ese caracter en buffer.

2. Por otro lado tienes preservadas que es un puntero a caracteres. Un puntero es un numero que es una dirección de memoria, o si lo prefieres es una variable que apunta a otra variable. En este caso seria un puntero que apunta a caracteres(char), en concreto a 4096 caracteres.
Para escribir en la memoria que apunta el puntero tienes que escribirlo asi
preservadas = buffer;
tienes que imaginarte el preservadas como la base de un monton de memoria e i como el indice del dato que quieres manejar.

Te lo aclaro asi... pongamos en fila a los 4096 caracteres.

indice          caracter(byte)          dirección de memoria
0                preservadas[0]            memoria + 0
1                preservadas[1]            memoria + 1
2                preservadas[2]            memoria + 2
....                      ................................
4094           preservadas[4094]
4095           preservadas[4096]

NOTA: Recuerda que en C cuando empiezas a contar posiciones cuentas a partir del 0.

3. Los punteros tambien se pueden usar de otra manera... por ejemplo
*preservadas = buffer   Esto colocaria buffer en la memoria que apunta preservadas. Al principio seria la posicion numero 0. Luego haces
preservadas++; (o preservadas += 1 )  con esto le dices que el puntero pase a apuntar al siguiente elemento(caracter) entonces preservadas apuntaria ahora al caracter numero 1. Y si quiero cambiar ese caracter(el numero 1) entonces hago otra vez *preservadas = buffer;
En fin, esta manera de verlo es al principio mas dificil de entender quizas la forma puntero[indice]  te sea mas facil. Lo malo de esta manera es que necesitas guardar la primera posicion de memoria que es la que tiene preservadas al principio de todo.

En fin, veo que tienes que mirar tambien el tema de cadenas... strcpy() strcmp() strncpy() etc ... estas funciones te ayudaran con lo que quieres hacer.


Por cierto fread(buf,sizeof(char),4,preservadas);   esta mal mirate la documentacion de esa funcion

printf("%c",buf); esto imprime un caracter y creo que tu quieres imprimir una cadena de texto. Utiliza %s. Y recuerda que las cadenas de texto en C terminan con un caracter que tiene el valor 0.

Entonces siguiendo el codigo de fiero tendrias que poner
if(buffer==_igual) { preservadas = 0;  analiza(   ); }
para que tu cadena termine en 0

en fin, falta pulir mucho esto amigo... espero que te hayamos dado un buen empujon....


Un saludo                                
Título: problemas con malloc
Publicado por: loxo en 19 de Enero de 2003, 10:50:02 PM
                               
Citarmi intencion es hacer un parser que cuando lea una palabra de un texto sea capaz dee cambiarla por otra

Lo que no puedo hacer es la parte de encontrar la palabra exacta :...( ¿alguna idea? Gracias                                
Título: problemas con malloc
Publicado por: loxo en 19 de Enero de 2003, 10:57:43 PM
                                Justo metia en quote en este post he visto tu respuesta nostromo , Gracias por la explcacion mas o menos entiendo todo , ahroa mirare la manera de hacerlo para que funcione jejej                                
Título: problemas con malloc
Publicado por: loxo en 19 de Enero de 2003, 11:13:01 PM
                                veran ;


int main(int argc, char *argv[1])

{



ficheroPar=fopen(argv[1],"rb");

if(ficheroPar==NULL) { printf("Error : el fichero %s no se puede abrir",argv[1]);exit(1);}



preservadas=(char*)malloc(4096);

while(!feof(ficheroPar)){

 buffer=fgetc(ficheroPar);

 preservadas[contador]=buffer;

 contador++;



 }

fclose(ficheroPar);

printf("%s",preservadas+=4);





return 0;

 

}


ahora por ejemplo , si en el ficheor hay escrito ,  loxoesguay , el printf me muestra esguay , omitiendo los 4 caracteres primeros, creo que eso significa que desde 0 a 3 (ambos incluidos) esta la palabra loxo, si es asi ¿Como puedo acceder a ella para que asi pueda con strcmp compararla con otra ?

Me estoy poniendo pesado , pero no logor entender los libros de C que tengo al lado , gracias a todos vosotros creo estar en buen camino ( peloteo  maximum x) )                                
Título: problemas con malloc
Publicado por: fiero en 19 de Enero de 2003, 11:43:03 PM
                               
Citar
ahora por ejemplo , si en el ficheor hay escrito ,  loxoesguay , el printf me muestra esguay , omitiendo los 4 caracteres primeros, creo que eso significa que desde 0 a 3 (ambos incluidos) esta la palabra loxo, si es asi ¿Como puedo acceder a ella para que asi pueda con strcmp compararla con otra ?

No te imprime solo "esguay" porque ponga loxo en los 4 primeros caracteres, lo imprime porque incrementas el puntero en 4 unidades en la función printf("%s",preservadas+=4); ¿por que lo incrementas?  :)

Bueno, te voy a poner un ejemplo, cómo buscar una palabra con tu código:



int main(int argc, char *argv[1])

{

   char buscar[]="guay";

   int longitud,i;    



   ficheroPar=fopen(argv[1],"rb");

   if(ficheroPar==NULL) { printf("Error : el fichero %s no se puede abrir",argv[1]);exit(1);}



   preservadas=(char*)malloc(4096);

   while(!feof(ficheroPar))

   {

         buffer=fgetc(ficheroPar);

         preservadas[contador]=buffer;

         contador++;

   }

   fclose(ficheroPar);

   printf("%s",preservadas);



   longitud=strlen(buscar);

   i=0;

   while(i<=contador-longitud)

   {

        if(strncmp(&preservadas[i],buscar,longitud)==0)

       {

            printf("Palabra encontrada en la posición %d: %s",i,&preservadas[i]);

       }

       i++;

   }

   ffree(preservadas);

   return 0;

}



No olvides el ffree

un saludo                                
Título: problemas con malloc
Publicado por: loxo en 20 de Enero de 2003, 12:08:49 AM
                                Sois todos de puta madre tios , muchas gracias por ayudarme                                
Título: problemas con malloc
Publicado por: Mars Attacks en 20 de Enero de 2003, 09:34:24 AM
                                Macho, esto es ayuda de lujo  8O
Deberíais escribir un libro ;)