![]() |
como guardar una palabra de un archivo .txt
necesito sacar una palabra de un archivo .txt con el siguiente formato:
QUESO;5 PLANCHA;4 TORTUGA;9 ZAPATO;6 HORMIGA;1 UNIVERSIDAD;3 TECLADO;8 INFORMATICA;7 INGENIERIA;2 LETRERO;10 el numero es el orden en como debo sacarla, y guardala en una variable. COMO LO HARIA? ESTO SERIA PARA EL LENGUAJE C |
¿Y qué parte no sabes?, ¿qué codigo tienes?, ¿dónde tienes el problema?
|
yo leo el archivo, pero lo leo por caracteres, pero cuando trato de poner cada caracter en una sola variable no puedo, no se hacerlo en c.
Código PHP:
Código PHP:
|
Cita:
Por cierto, bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :) Recuerda poner los tags al código fuente, ejemplo: ![]() Gracias :) |
1 Archivos Adjunto(s)
esa es la imagen, me sale una ventana emergente.
|
Depúralo paso a paso para encontrar la línea que te da el problema.
|
Tienes varios fallos:
Código PHP:
Código PHP:
Código PHP:
|
Esto está probado y hace lo que quieres aunque yo en este caso usaria mejor fscanf y me quitaba de lios de leer caracter a caracter pero bueno:
Código PHP:
|
Hola jcdca.
Cita:
Pero te pongo un ejemplo que lee el archivo, separa las palabras de los números tomando en cuenta el delimitador ";" y va almacenando las palabras en un arreglo cuyo índice está dado por el número leido: Código PHP:
|
listo gracias, son unos genios jeje... es que nunca había usado el lenguaje c y hay cosas que se me complican todavía... ya me corre bien ;) gracias a todos.. era eso de concatenar así: palabra+=caracter; lo puse como me dijeron con un indice y corre, pero ahora tengo otra duda, estoy tratando de que imprima solo una palabra, por ejemplo:
QUESO;5 PLANCHA;4 TORTUGA;9 ZAPATO;6 HORMIGA;1 UNIVERSIDAD;3 TECLADO;8 INFORMATICA;7 INGENIERIA;2 LETRERO;10 de esa lista que les di antes también, yo leo carácter por carácter, guardando la palabra, hasta llegar al punto y coma, cuando llego al punto y coma leo el numero y con un if lo comparo con el numero 1, para ver si es la primera palabra que en este caso seria hormiga, si no es la primera, borro la palabra y sigo buscando hasta conseguirla. asi tengo el código: else { caracter = fgetc(archivo); //esto me lee el numero que esta al lado del punto y coma int aux = (int) (caracter - 48); //esto me convierte ese numero en entero if (aux==x) //esto me compara ese numero con x, que en este caso es 1 {palabra[i] = '\0'; printf("\n %s",palabra); getch(); break; }else {} el código así si funciona, pero me imprime todas las palabras hasta llegar a la primera, QUESOPLANCHATORTUGAZAPATOHORMIGA y se detiene cuando llega a la primera... la cosa es que necesito vaciar la variable para que no me las guarde todas, si no solo la ultima palabra... esa parte de vaciar tendría que ponerla en el ultimo else si no me equivoco... intente poniendo en el else esto: *palabra = '\0';, y nada, si pongo eso no me imprime nada de nada, no me da error pero tampoco me imprime.... también intente con palabra[0]=0; y lo mismo no imprime nada. probé también poniendo palabra[i] = '\0'; en el else y no hace nada, me sigue imprimiendo todas las palabras hasta la llegar a la primera.. y con la funcion memset() me da un error no se si es que me falta alguna librería o algo. el getch(); es solo para que se detenga y ver si imprimia algo. y el break es para romper el ciclo, que imagino que ya lo saben, pero bueno jeje |
Hola jcdca.
Por favor, cuando incluyas código en tus mensajes usa las etiquetas como indica la siguiente imágen: ![]() Saludos y gracias por tu colaboración :) |
Creo que te complicas mucho la vida, yo usaria archivos con registros de tamaño fijo.
En este ejemplo puedes ver como crear un archivo secuencial y lo relleno y luego busco en el tanto por nombre como por numero de registro. Es mucho mas sencillo de manejar. Código PHP:
|
ya pude hacerlo, pero ahora tengo otro problemita :) recorro el archivo y saco las palabras en orden, y llamo a la funcion insertarenlista para meter todas las palabras en orden en una lista, al parecer si la llena o eso creo yo, pero al momento de imprimirla me muestra simbolos extraños, no se si es que la lleno mal, o que la imprimo mal o lo que sea, alguien sabe que tengo mal?
Código PHP:
|
lo he mirado por encima en el movil y la verdad es que no tiene mucho que ver con lo que mostrabas antes pero a simple vista, en la funcion que añade nuevos registros veo "nuevoNodo->palabra[30]=palabra[30]; " y eso está mal. Lo que haces es copiar el caracter 30 y solo ese. Puedes optar por usar strcpy, strncpy, o un bucle que copie todo el array pero no se puede copiar una cadena con un simple igual ya que lo que haces en realidad es asignar la direccion y no su contenido y al cambiar el contenido del array cambia en ambos.
|
Para que sepan esto es lo que tengo que hacer:
Consiste en un juego donde el usuario deberá adivinar un conjunto de palabras las cuales serán cargadas desde un archivo con formato txt (su formato será indicado más adelante en el presente documento). El juego consiste en que una vez cargue una lista de palabras a adivinar por el usuario, este deberá ir ingresando letras por el teclado, en caso de que la letra introducida pertenezca a la palabra deberá mostrarse por pantalla, en caso contrario, deberá restarle una vida. Durante la partida el usuario podrá equivocarse cinco (5) veces máximo, luego de cometer este número de equivocaciones, la partida se dará por terminada y se le deberá notificar dicha situación, dándole la oportunidad de iniciar una nueva. Al iniciar una partida se le deberá preguntar al usuario cuantas palabras desea que tenga la partida, siendo el mínimo 3 y el máximo 10, se leerán las todas las palabras que contenga el archivo y se mostrará dicho número introducido por el usuario siguiendo el orden que se muestra en la sección de estructura del archivo. Las letras introducidas indican las teclas que van presionando los usuarios (deben omitirse los caracteres especiales tales como ñ, á, #, etc. Así como números 123456789, el número cero (0) si debe de leerse al ser introducido por teclado ya que será interpretado como la instrucción para finalizar la partida por parte del jugador. Al finalizar la partida, debe de preguntársele al usuario nuevamente el número de palabras a ser mostradas, leerse la totalidad del archivo, ordenarlas según el formato y desplegar la cantidad de palabras indicadas por el usuario. Para la lista de palabras a ser mostradas durante la partida deberá utilizarse obligatoriamente una lista u otro conjunto de manejo dinámico, bajo ningún concepto se permite utilizar arreglos para tal fin, el equipo que utilice este elemento para mostrar las palabras a ser utilizadas en la partida será reprobado lamentablemente con una nota de 01 en dicha entrega. Las letras restantes, indican el resto de letras del abecedario que el usuario puede introducir todavía para la palabra que se muestra en pantalla. Cada vez que se pase a una nueva palabra, la lista de letras introducidas y restantes deben reiniciarse, en el caso de las introducidas ponerse en blanco, en caso de las restantes, mostrar todo el abecedario (Omitir la letra ñ). La siguiente línea de la interfaz deberá mostrar la palabra por la que va el jugador de las 10 cargadas. Las vidas restantes, 5 en total, deberán mostrarse en pantalla con algún símbolo, corazón por ejemplo, cada vez que el usuario se equivoque, es decir introduzca una letra que no pertenezca a la palabra en pantalla se le restará una vida de las 5 disponibles. Es importante resaltar que las vidas del usuario son para toda la partida, no por palabra, razón por la cual las mismas no deben reiniciarse al pasar a la siguiente palabra como si ocurre con las listas de letras introducidas y letras restantes. Por último, como de indico anteriormente, debe mostrarse la opción para salir de la partida, es decir la tecla 0, si el usuario introduce dicho carácter, la partida deberá terminar y volver a leerse el archivo de 10 palabras ordenadas según se indique en la estructura del mismo. En caso de que el usuario logre pasar las 10 palabras de la partida, el juego deberá notificarle que ha concluido con éxito la misma, felicitándolo y volviendo a iniciarse una nueva partida una vez el usuario haya culminado la misma. Ya llene la lista con las palabras del archivo, ahora quiero sacar una por una para comparar las letras de la palabra con las introducidas por el usuario |
a ver, cuando trabajas con listas, al crearla, guardas en un puntero la direccion al primer miembro de la lista y luego simplemente usas una nueva estructura de ese tipo a la que le asignas la direccion de ese puntero y tendras al primer miembro, para leer el siguiente le asignas al puntero la direccion que contiene next en tu caso y asi hasta que next sea null. Si pones todo el proyecto te podremos ayudar mas eficientemente ya que si no nos tocaria adivinar cosas. Un detalle, si usas malloc no te olvides de usar free para liberar la memoria de todos sus miembros.
|
Aqui se explica bien claro y sencillo el funcionamiento de las listas enlazadas simples que es lo que estás usando: http://es.kioskea.net/faq/2842-la-lista-enlazada-simple
PD: No te vamos a hacer el trabajo pero si pones tu codigo y nos dices en que fallas pues te podriamos ayudar jejeje. |
Cita:
|
bueno aquí esta el código
Código PHP:
Código PHP:
Código PHP:
podría declarar la variable fuera de todas las funciones y me serviría, pero no quiero eso, quiero pasarla por referencia, porque ya lo he intentado varias veces y no me sale... bueno esas son mis tres dudas por ahora, porque ignora el scanf la primera vez, como paso minusculas a mayusculas y como paso por referencia.. y desde ya, gracias por la ayuda ;) |
lo del scanf seguramente es porque el flujo de entrada contiene datos, limpialo antes del scanf con un fflush(stdin). Para pasar de minusculas a mayusculas simplemente asegurate que sea una letra en minusculas con un condicional y si lo es le restas 32. Para lo de las vidas si pasasla direccion luego para acceder a su contenido haz *vidas. Pon el asterisco delante. Lee informacion sobre el uso de punteros. No entiendo como te mandan algo tan complejo sin tener claro el uso de punteros, filas, flujo... Dentro de un rato veo tu codigo a ver si veo algo raro.
|
Mira, esto lo hice yo pero igual te sirve para apoyarte y ver en que te falla a ti:
Código PHP:
|
eres un genio jeje, gracias, me ayudaste mucho ;) de verdad te lo agradezco. te debo una ;) jeje
|
Otra forma que se me ocurrio de ordenar una lista simple:
Código PHP:
Si consigues un método mejor compartelo aquí por favor, estoy interesado ya que nunca se me ocurrio ordenar una lista enlazada y he visto que es algo complejo de hacer. |
Bueno, el uso de una lista auxiliar no era eficiente porque hay varias iteraciones y por el uso doble de memoria así que despues de mucho darle vueltas y mucha ayuda para entender como hacerlo con punteros he conseguido hacerlo intercambiando los punteros de la lista:
Código PHP:
|
bueno, ya esta casi hecho... esta todo listo, pero tengo un inconveniente, cuando recorro el archivo por primera vez y lleno la lista va bien, pero cuando lo hago la segunda vez, la primera palabra del .txt me la agrega a la lista con un espacio en blanco, o eso creo, es un caracter mas al principio, no estoy seguro de que sea un espacio. codigo= funciona todo bien, como lo tengo que entregar, menos lo que les digo de la palabra... y sin modificar el texto igualmente me agrega el caracter, no se si es cuando abro el archivo en modo lectura, que crea un caracter para poder leerlo o algo, veanlo ustedes a ver si saben que es.
Código PHP:
|
sin verlo en el depurador no puedo decirte pero tiene toda la pinta de que al terminar la primera vez se queda algo residual en el flujo de entrada. Prueba a poner un fflush(stdin) antes de la funcion que rellena la lista. Seguramente no sea un espacio sino un salto de pagina o eof o algo asi.
|
mira, estoy en la calle viendolo desde el movil pero creo que di con el fallo. Tienes dos funciones, ganar y perder o algo asi donde muestras el mensaje de que gana o pierde y luego preguntas si quiere jugar una nueva partida y usas un fgetch para obtener la respuesta. Pon un fflush(stdin) despues de ese fgetch en ambas funciones y si tienes mas comprobaciones de ese estilo en otras funciones haz igual. ¿Cual es el problema? fgetch() captura un caracter pero tu en realidad introduces 2, el que deseas y el intro que es un salto de linea. Asegurate siempre de si es necesario un fflush detras de un getch o fgetch (será necesario siempre que se tenga que ntroducir un caracter por teclado y pulsar intro. Ya nos cuentas si se solucionó. Por cierto, si el trabajo tiene que ser en C, no puede haber declaraciones de variables en cualquier sitio, eso se permite en c++ pero en c no.
|
si tienes razón no es un espacio en blanco, pensé que si porque cuando imprimía la lista para ver que pasaba, una de las palabras salia mas separada del margen que las otras por eso pensé que era un espacio, pero no lo es, ya lo comprobé, puse el fflush que me dijiste cuando relleno la lista, pero nada, sigue poniéndome ese carácter, no se que pueda ser jeje
y en cuanto a los fflush que me dices que faltan en la parte de mostrar los mensajes si gane o perdí, debe ser que lo viste mal, si los tengo, o sea que eso tampoco es. y los de las variables en cualquier lugar imagino que te refierieres a la que declaro como globales fuera de las funciones no? o a alguna que tengo en medio de alguna sentencia o algo así? |
lo depure y la segunda vez que pasa, con la palabara queso, que es la primera del archivo me la agrega con '377QUESO' y no se porque hace eso, la variable que contiene la palabra se llama justamente así, variable, y la limpio antes de agregar la nueva palabra, es decir que ya se bebe guardar así con esos números en la lista, pero cuando yo lo guardo en la lista, la guardo con una variable llamada palabra, esa también la limpio, y esa palabra la lleno con la variable caracter que es la que recorre el archivo, y esa variable caracter la valide con un ciclo, del cual no se sale si caracter es algo distinto a una letra o un punto y como, es decir lo único que puede a ver en esa palabra son letras, como llegan esos numero no se jejeje
|
Antes de nada pido perdon a los admins por lo que voy a hacer pero el movil en esta web no me deja poner saltos de linea y supongo que es por algun script.
Código:
printf("\n "); |
aa ok no sabia que despues habia que poner otro, pense que solo era antes del getch, bueno ya se lo pongo y lo de la variable, debe ser que se me paso, voy a revisar todo el codigo a ver, no sabia eso de c pero igual yo siempre las coloco al principio de la funcion por costumbre, debe ser que se me paso, y ya solucione lo del problema de la palabra, ya les dijo que era y les paso el codigo final ;)
|
bueno aquí esta, puse en verde lo que le agregue... el problema era que cuando llega al final del archivo, el entra en el ciclo donde se valida que caracter sea distinto de \n... y después de ese ciclo, hay un if que valida el punto y coma, pero como es el final del archivo a caracter en ese momento le agraga '377' porque ya no hay nada en el archivo, y cuando vuelvo a abrir el archivo tengo que limpiar la variable palabra para que no tenga ese '377', solo pasa con la palabra que esta al principio porque para las demás si limpiaba la palabra, pero antes de empezar ese ciclo no la limpiaba, por eso el error... era una tontería jeje, pero bueno suele pasar. acomode las variables, lo tenia así en varios sitios, no me di cuenta.Gracias ;)
Código PHP:
|
jajaja no me lo puso en verde, bueno lo que esta encerrado entre el codigo que dice color="lime" eso es lo que agregue jejeje.
|
| La franja horaria es GMT +2. Ahora son las 04:15:41. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi