Título: Leer de la entrada estandar linea por linea Publicado por: Delraich en 5 Julio 2010, 23:57 pm Primero q nada hola a todos, empece hace poco a programar en C.. Lo q mas me interesa es programar algoritmos de matematica discreta, y tengo problemas con uno q calcula MaxFlow en un grafo.. con el algoritmo en si no, sino con la entrada estandar.. Quiero q lea desde la entrada estandar, cosas de la siguiente manera:
a b c donde a, b y c son enteros... Pero quiero q lea mientras una linea sea de ese tipo.. cuando llega algo q no es de ese formato, deberia dejar de leer en la entrada estandar.. entonces para q quede claro, deberia poder poner por ejemplo: 1 2 3 3 2 5 4 5 2 3 En este ejemplo, quiero q tome el 1 2 3, el 3 2 5, el 4 5 2 y q deje de leer cuando vea q la 4ta linea tiene un solo numero... Otro ejemplo seria 1 2 3 4 5 6 2 4 5 6 Aqui deberia leer 2 lineas, y cortar cuando llega la 3ra porq tiene un entero de mas.. Y tambien tiene q cortar si llega algo asi: 1 2 3 3 4 5 hola Lee 2 lineas, y luego corta porq llega algo q no tiene nada q ver con el formato... Probe con scanf pero no logro q corte cuando la linea tiene caracteres de menos.. ya q el scanf se queda esperando a q se completen sus parametros...\ Por otro lado tampoco logro q corte cuando llegan caracteres de mas, ya q los guarda en el buffer para el siguiente scanf... Asi q si me pueden ayudar, desde ya les agradezco Título: Re: Leer de la entrada estandar linea por linea Publicado por: nicolas_cof en 6 Julio 2010, 00:45 am Delraich, bienvenido! te recomendaria leer las Reglas del subforo (https://foro.elhacker.net/programacion_cc/reglas_del_subforo-t251603.0.html)
Si pones algo del avance que llevas hecho seria mas facil para nosotros poder ayudarte. Te invito a que pases por estos temas... https://foro.elhacker.net/programacion_cc/librospapers_c_and_c-t296234.0.html https://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html Salu10. Título: Re: Leer de la entrada estandar linea por linea Publicado por: Littlehorse en 6 Julio 2010, 00:46 am Podrías hacer un arreglo de cadenas e ir leyendo linea a linea, luego convertir los datos relevantes para poder operarlos. Podrías también leer una cadena con toda la expresión, para luego poder tomar los datos relevantes de dicha expresión, convertirlos y operarlos.
Pon el código que llevas hecho a ver si podemos partir de ahí para ayudarte. Saludos Título: Re: Leer de la entrada estandar linea por linea Publicado por: ghastlyX en 6 Julio 2010, 00:56 am Puedes leer una línea entera usando
Código Donde s es una string. Luego para parsear la entrada, si sabes que siempre serán números, puedes usar stringstream e ir leyendo desde s y añadiendo en un vector los números. Si no, deberías picar alguna función que compruebe que si es número o no. En referencia al algoritmo, ¿cuál usas para calcular el Maxflow? Título: Re: Leer de la entrada estandar linea por linea Publicado por: Delraich en 6 Julio 2010, 01:03 am Antes q nada, muchas gracias por responder tan rapido...
El programa la verdad es bastante extenso, sobre todo la parte del algoritmo en si.. pero la parte q lee desde la entrada estandar seria algo asi : Ya cree la estructura donde voy a guardar el network (grafo).. y ahora tengo q agregar lado por lado... esta funcion está en un ciclo.. el ciclo corta cuando el valor de esta funcion es 0.. por eso, esta funcion debe devolver 1 mientras la entrada estandar sea del formato q quiero, y 0 cuando no sea.. La funcion CargarLado se encarga de tomar los 3 enteros (q serian vertice 1 del lado, vertice 2 del lado y capacidad de ese lado) y los introduce en la esctructura del grafo.. si puede cargarlos bien, devuelve 1.. sino, devuelve 0.. El problema aca es q cuando introduzco algo por entrada estandar q tiene caracteres, pero menos de 3 o mas de 3, el programa no corta.. sino q se queda esperando.. yo necesitaria que tome la linea entera como dice Littlehorse, pero la verdad no se como hacerlo Código
Recien leo la respuesta de ghastlyx, voy a intentar hacerlo asi, pasa q no siempre van a ser numeros, asi q voy a tener q primero ver si son numeros, y si lo son ver si son la cantidad q necesito.. Estoy implementando el algoritmo de Dinic, con el paso bloqueante tambien de dinic.. Luego quizas intente wave, pero necesito poder ingresar los datos del grafo bien primero Título: Re: Leer de la entrada estandar linea por linea Publicado por: Littlehorse en 6 Julio 2010, 01:06 am El problema es que lo te menciono ghastlyX es C++, y según mencionas vos en el post inicial, estas codificando el algoritmo en C.
Declara una cadena, y léela con fgets, luego puedes parsear los datos y operarlos previa validación. Saludos Título: Re: Leer de la entrada estandar linea por linea Publicado por: ghastlyX en 6 Julio 2010, 01:14 am No me había fijado que había puesto C, sin STL lo que he dicho como que no xDD.
Por si te sirve de ayuda, te dejo un código del algoritmo de Dinic que tenía hecho, sigue el formato de entrada y salida de este problema: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=10&page=show_problem&problem=761 Código
Título: Re: Leer de la entrada estandar linea por linea Publicado por: do-while en 6 Julio 2010, 01:31 am ¡Buenas!
para poder leer linea por linea puedes declarar una vector de caracteres de dimension "algo grande", y leerlo con fgtes: Código
El resto te lo dejo a ti. Tendras que estudiar las funciones de manejo de cadenas de stringh, de stdlibh, y seguramente tambien las de stdio.h. ¡Saludos! Título: Re: Leer de la entrada estandar linea por linea Publicado por: Delraich en 6 Julio 2010, 01:38 am De nuevo gracias por la ayuda, ya me voy a tomar un tiempo y leer el algoritmo q posteaste ghasltyx, ahora voy a intentar tomar linea por linea como me recomendaron, y ver como parseo la info... luego les cuento q tal me fue
Título: Re: Leer de la entrada estandar linea por linea Publicado por: MIG80 en 6 Julio 2010, 01:54 am Bueno...talvez esto te solucione el problema con la entrada...
Código: int leer3ent(int *c1,int *c2,int *c3) Saludos. Título: Re: Leer de la entrada estandar linea por linea Publicado por: Delraich en 6 Julio 2010, 02:18 am Muchas gracias czealt, eso es justamente lo q necesitaba! xD.. De nuevo muchas gracias a todos, y espero dentro de poco poder ayudarlos yo a ustedes
Título: Re: Leer de la entrada estandar linea por linea Publicado por: Littlehorse en 6 Julio 2010, 03:14 am czealt, recuerda que utilizar fflush con stdin invoca comportamiento indefinido.
Saludos Título: Re: Leer de la entrada estandar linea por linea Publicado por: misterharry en 6 Julio 2010, 04:10 am czealt, recuerda que utilizar fflush con stdin invoca comportamiento indefinido. Saludos D: porque??? que es lo que hace para inestabilizar el comportamiento??? perdon la ignarancia pero me llama la atencion esto Título: Re: Leer de la entrada estandar linea por linea Publicado por: do-while en 6 Julio 2010, 04:27 am Aqui (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html) explica porque hay que utilizar fflush con sdtin, y otras muchas cosas que pueden dar problemas si no se manejan con cuidado.
¡Saludos! Título: Re: Leer de la entrada estandar linea por linea Publicado por: misterharry en 6 Julio 2010, 04:44 am jaja justo venia desde ese post (y muchos mas) donde esplican porke no debe usarse
gracias de todos modos. :D bueno, jamas habia usado fflush para algo distinto de vaciar stdin. de hecho pense que para eso era.. no entiendo bien para que se ocupa reamlmete, visite cconclase para salir de la duda pero quede peor xD onda, por un post lei que era para forzar la escritura y no para liberarla o algo asi :S Título: Re: Leer de la entrada estandar linea por linea Publicado por: MIG80 en 6 Julio 2010, 19:53 pm czealt, recuerda que utilizar fflush con stdin invoca comportamiento indefinido. Saludos Bueno, reemplazando la línea fflush(stdin), el código corregido seria: Código: int leer3ent(int *c1,int *c2,int *c3) a partir de ahora recordare no usar fflush(stdin), gracias por la información. Saludos. |