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
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...
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);
}
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;
}
mi intencion es hacer un parser que cuando lea una palabra de un texto sea capaz dee cambiarla por otra
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
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
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
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) )
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
Sois todos de puta madre tios , muchas gracias por ayudarme
Macho, esto es ayuda de lujo 8O
Deberíais escribir un libro ;)