Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





problemas con malloc

Iniciado por loxo, 19 de Enero de 2003, 09:10:53 PM

« anterior - próximo »

loxo

                                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                                
lt;-- Cuando pensaba que ya nada mas podria pasarme ... te conoci..... -->

Mars Attacks

                                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...                                

loxo

                                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);
}                                
lt;-- Cuando pensaba que ya nada mas podria pasarme ... te conoci..... -->

fiero

                                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;

}                                
www.videopanoramas.com Videopanoramas 3D player

loxo

                                mi intencion es hacer un parser que cuando lea una palabra de un texto sea capaz dee cambiarla por otra                                
lt;-- Cuando pensaba que ya nada mas podria pasarme ... te conoci..... -->

nostromo

                                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                                

loxo

                               
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                                
lt;-- Cuando pensaba que ya nada mas podria pasarme ... te conoci..... -->

loxo

                                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                                
lt;-- Cuando pensaba que ya nada mas podria pasarme ... te conoci..... -->

loxo

                                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) )                                
lt;-- Cuando pensaba que ya nada mas podria pasarme ... te conoci..... -->

fiero

                               
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                                
www.videopanoramas.com Videopanoramas 3D player

loxo

                                Sois todos de puta madre tios , muchas gracias por ayudarme                                
lt;-- Cuando pensaba que ya nada mas podria pasarme ... te conoci..... -->

Mars Attacks

                                Macho, esto es ayuda de lujo  8O
Deberíais escribir un libro ;)                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.