Título: Extraer palabras de un texto leido en un archivo (en C) Publicado por: Locura_23 en 21 Noviembre 2022, 14:42 pm Buenas a todos,
resulta que estoy teniendo un error con este codigo, tal vez no estoy viendo algo o me falta un concepto. La idea seria leer un texto por usuario y guardarlo en un archivo binario, segundo, mostrarlo por consola, y lo mas importante extraer todas y cada una de las palabras del texto ingresado por usuario. Ahora bien, tengo entendido que los archivos binarios son mejores para guardar registros ( estructuras) y los archivos txt para texto. Lamentablemente, me piden que sean archivos binarios... Cosa que no le veo mucho sentido. El error es que si ingreso un texto de mas de 3 o 4 palabras aveces algunas palabras se muestran con basura. Por ejemplo si ingreso "la casa roja y el perro blanco" no hay problema. Si ingreso "la raiz cuadrada de una potencia" entonces la palabra "cuadrada" muestra basura tambien. Esto por poner algunos ejemplos. Este el codigo, (por cierto mucho que mejorar) gracias, saludos. Código
Por ultimo decir que pense como solucion utilizar memoria dinamica de manera que solo se guarden en el archivo estrictamente los caracteres del texto ingresado y no otra basura que me pueda estar guardando. qué opinan al respecto? Título: Re: Extraer palabras de un texto leido en un archivo (en C) Publicado por: K-YreX en 21 Noviembre 2022, 18:07 pm Tras un par de pruebas, todo parece indicar que a partir de palabras con 8 caracteres, se muestra basura al final.
De todas formas, aunque en alguna ocasión no se vea basura, no significa que el funcionamiento sea correcto. Por lo tanto, vamos a verlo... Respondiendo a tu pregunta final: Se podría usar memoria dinámica? Sí. Es necesario? No. Ahora lo vas a ver... :o Parte 1: Crear fichero (a partir de aquí vamos a suponer que introduzco "hola") Aquí ya podemos hacer varias mejoras:
Código
Código
Parte 2: Mostrar fichero Aquí tenemos que leer el contenido del fichero. Lo importante es que no se nos cuele basura después del texto que hay dentro del fichero. La solución más sencilla es inicializar el array de chars con 0s. 0 es el valor numérico del carácter nulo (0 = '\0') De esta manera, con fread leeremos el contenido del fichero y el resto de espacio que sobre en el array ya estará rellenada con 0s por lo que no mostraremos ninguna basura. Código
Parte 3... Está es para ti que sino menudo aburrimiento si no puedes probarlo tú mismo :-X Título: Re: Extraer palabras de un texto leido en un archivo (en C) Publicado por: Locura_23 en 22 Noviembre 2022, 01:47 am Qué crack ! Gracias maestro, la verdad me ayudaste un monton. Continué programando igual el sistema porque con parrafos omitia la basura al parecer, pero era un poco incierto el funcionamiento jaja, pero ahora parece más estable.
Lo de inicializar el arreglo con ceros fue clave, y reescribi el programa con memoria estatica, y de momento no me esta mostrando basura como antes. Lo que sí se me volvio a romper en la parte donde reemplacé sizeof() por strlen() tanto en fwrite() como en fread(), pero voy a ver bien qué puede ser. (Te referias de usar: fwrite(&texto, sizeof(char)* strlen(texto), 1, pfile) ) ? Lo del fgets() sí voy a reemplazarla en cuanto antes, justamente por este foro me enteré de que gets() no era recomendable jaja. Lo de la parte 3 supongo que te refieres a la funcion archivoToDic()? En esa parte también inicialize el arreglo Código que este arreglo se utilizaba para guardar una palabra del texto general. Título: Re: Extraer palabras de un texto leido en un archivo (en C) Publicado por: K-YreX en 22 Noviembre 2022, 18:56 pm Lo que sí se me volvio a romper en la parte donde reemplacé sizeof() por strlen() tanto en fwrite() como en fread(), pero voy a ver bien qué puede ser. (Te referias de usar: fwrite(&texto, sizeof(char)* strlen(texto), 1, pfile) ) ? Cuando lees del archivo no sabes cuántos bytes tienes que leer por eso se intenta leer el máximo disponible: TAM_MAX. Por otro lado, no hace falta multiplicar strlen(texto) por sizeof(char). Sí sería la forma correcta pero como un char ocupa 1 byte, sizeof(char) = 1. Por eso se puede omitir esa multiplicación y hacer el código un poco más sencillo. Si la pones no está mal, estaría bien porque si el tamaño de un char cambiase seguiría funcionando bien. Lo de la parte 3 supongo que te refieres a la funcion archivoToDic()? En esa parte también inicialize el arreglo Código que este arreglo se utilizaba para guardar una palabra del texto general. Si no lo consigues vuelve a dejar la parte que te da problemas con los avances y así poder echarle un ojo :o |