elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Sobreescribir línea ya escrita lenguaje C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Sobreescribir línea ya escrita lenguaje C  (Leído 10,047 veces)
Sagrini

Desconectado Desconectado

Mensajes: 107


Ver Perfil WWW
Sobreescribir línea ya escrita lenguaje C
« en: 29 Diciembre 2011, 18:57 pm »

Buenas! El otro día estaba haciendo un ahorcado en C y pensé que la salida era muy grande. Se me ocurrió escribir "sobre" lo que ya había escrito antes, lo que llegaría a ser lo que hace "apt-get", etc... cuando hacen una barra de progreso. Mi primera idea fue usar lseek (), pero no me dio resultado. Alguna idea? ;) Gracias!

PS: Os dejo una idea de lo que intentaba hacer:
Código
  1. #include <stdio.h>
  2. int main ()
  3. {
  4. printf ("1\n");
  5. printf ("2\n");
  6. lseek (stdin, 0, 0);
  7. printf ("3\n");
  8. return 0;
  9. }
  10.  
Código:
$ gcc -o code code.c
$./code
3
2
$


En línea

El_Java

Desconectado Desconectado

Mensajes: 144



Ver Perfil WWW
Re: Sobreescribir línea ya escrita lenguaje C
« Respuesta #1 en: 29 Diciembre 2011, 20:47 pm »

Lo más sencillo es que hagas una limpieza de terminal (como si fueran los fotogramas de un dibujo animado). Cada vez que vayas a mostrar algo haz justo antes esto:
Código
  1. #include <cstdlib>
  2.  
  3. #ifdef _WIN32
  4.   system("cls"); //para windows
  5. #else
  6.   system("clear"); //para sistemas Linux
  7. #endif
  8.  

EDITO: he colocado bien el include, gracias a rir3760

Un saludo!


« Última modificación: 29 Diciembre 2011, 22:26 pm por El_Java » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Sobreescribir línea ya escrita lenguaje C
« Respuesta #2 en: 29 Diciembre 2011, 21:08 pm »

Para tener acceso al prototipo de la función "system" se debe incluir el encabezado <stdlib.h> en el caso de C o <cstdlib> en el caso de C++.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
satu


Desconectado Desconectado

Mensajes: 301

Siempre aprendiendo


Ver Perfil WWW
Re: Sobreescribir línea ya escrita lenguaje C
« Respuesta #3 en: 29 Diciembre 2011, 21:48 pm »

Hola

Si estás en Windows puedes utilizar COORD, que está definida en "windows.h"

Su uso es tan sencillo como:
Código
  1. COORD coordenadas;
  2.  
  3. coordenadas.X = valorX;
  4. coordenadas.Y = valorY;
  5. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coordenadas);
  6.  

Saludos
En línea

Breakbeat como forma de vida
Sagrini

Desconectado Desconectado

Mensajes: 107


Ver Perfil WWW
Re: Sobreescribir línea ya escrita lenguaje C
« Respuesta #4 en: 29 Diciembre 2011, 22:45 pm »

No no... Culpa mía, se me ha olvidado concretar. No puedo usar librerías "para Windows" ni funciones "system ()", así como tampoco librerías como "conio.h", etc. La idea es hacerlo con una función estándar y disponible en todos los sistemas (Windows, Linux, Unix-like...).
Alguna idea más? ;)
En línea

Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: Sobreescribir línea ya escrita lenguaje C
« Respuesta #5 en: 30 Diciembre 2011, 00:12 am »

Los programas como el apt-get suelen usar el parámetro \r, que borra la línea actual. Te enseño un ejemplo:

Código
  1. #include <stdio.h>
  2. #include <Windows.h>
  3.  
  4. int main(int argc, char * argv[])
  5. {
  6. int i = 0;
  7. int progreso = 0;
  8.  
  9. for (; i <= 100; i++, progreso++)
  10. {
  11. printf("\rProgreso: %d", progreso);
  12. Sleep(250);
  13. }
  14.  
  15. return 0;
  16. }
  17.  

El Sleep lo pongo para que puedas ver el progreso.

Saludos.
En línea

Karman


Desconectado Desconectado

Mensajes: 673



Ver Perfil WWW
Re: Sobreescribir línea ya escrita lenguaje C
« Respuesta #6 en: 30 Diciembre 2011, 05:24 am »

Los programas como el apt-get suelen usar el parámetro \r, que borra la línea actual.

no borra, mueve el cursor al inicio de la linea...

S2
En línea

Sagrini

Desconectado Desconectado

Mensajes: 107


Ver Perfil WWW
Re: Sobreescribir línea ya escrita lenguaje C
« Respuesta #7 en: 30 Diciembre 2011, 11:18 am »

Edito: La última solución me parece la mejor y más correcta. Gracias! ;)
« Última modificación: 30 Diciembre 2011, 13:42 pm por Sagrini » En línea

El_Java

Desconectado Desconectado

Mensajes: 144



Ver Perfil WWW
Re: Sobreescribir línea ya escrita lenguaje C
« Respuesta #8 en: 30 Diciembre 2011, 14:01 pm »

CONSEGUIDO! :D

La verdad Sagrini que a mi también me picaba la curiosidad sobre este tema, y me he puesto manos a la obra para investigar un poco sobre como funciona APT y todo eso. El caso que al final he llegado a un montón de información muy muy útil, dejo los links, porque explicar tanta cosa es muy dificil:
http://www.euskalnet.net/iosus/linux/Bash-Prompt-HOWTO-5.html#ss5.2 (Pto. 5.2)
http://es.wikipedia.org/wiki/C%C3%B3digo_escape_ANSI
http://www.chuidiang.com/clinux/ansi/ansi.php

Si ya has visto los links, sabrás que esto se consigue con códigos de escape ANSI, os dejo un ejemplo:
Código
  1. #include <cstdio>
  2.  
  3. int main(){
  4.    cout << "Hola" << endl;
  5.    for(int x=0; x<10; x++){
  6.        printf("%c[1A \rProgreso: %d\n", 033, x);
  7.        #ifdef _WIN32
  8.        #include <Windows.h>
  9.            Sleep(250);
  10.        #else
  11.            sleep(1);
  12.        #endif
  13.    }
  14.    return 0;
  15. }

Espero que os ayude tanto como a mí.
Un saludo!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Curiosidad] URL mal escrita « 1 2 »
Sugerencias y dudas sobre el Foro
Neobius 11 6,298 Último mensaje 9 Agosto 2006, 13:19 pm
por дٳŦ٭
problema en vb.net al llamar dll escrita en vc++
.NET (C#, VB.NET, ASP)
Sin Nick xD 2 5,542 Último mensaje 2 Marzo 2008, 21:09 pm
por Sin Nick xD
[AYUDA]Redireccion dependiendo de la url escrita
PHP
Ismaw34 6 4,491 Último mensaje 27 Octubre 2008, 22:29 pm
por WHK
vbscript: sustituir última linea escrita en stdout.
Scripting
BlaineMonkey 3 4,833 Último mensaje 6 Septiembre 2011, 10:48 am
por nosoqui
juego de cuatro en linea en lenguaje C
Programación C/C++
gwennnnnn26 5 3,641 Último mensaje 7 Diciembre 2016, 01:24 am
por jvm1994
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines