Sobreescribir línea ya escrita lenguaje C

Iniciado por Sagrini, 29 Diciembre 2011, 18:57 PM

0 Miembros y 1 Visitante están viendo este tema.

Sagrini

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:

#include <stdio.h>
int main ()
{
printf ("1\n");
printf ("2\n");
lseek (stdin, 0, 0);
printf ("3\n");
return 0;
}


$ gcc -o code code.c
$./code
3
2
$


El_Java

#1
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 (cpp) [Seleccionar]

#include <cstdlib>

#ifdef _WIN32
   system("cls"); //para windows
#else
   system("clear"); //para sistemas Linux
#endif


EDITO: he colocado bien el include, gracias a rir3760

Un saludo!

rir3760

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
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

Hola

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

Su uso es tan sencillo como:
Código (cpp) [Seleccionar]

COORD coordenadas;

coordenadas.X = valorX;
coordenadas.Y = valorY;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coordenadas);


Saludos
Breakbeat como forma de vida

Sagrini

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? ;)

Khronos14

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


#include <stdio.h>
#include <Windows.h>

int main(int argc, char * argv[])
{
int i = 0;
int progreso = 0;

for (; i <= 100; i++, progreso++)
{
printf("\rProgreso: %d", progreso);
Sleep(250);
}

getchar();
return 0;
}


El Sleep lo pongo para que puedas ver el progreso.

Saludos.

Karman

Cita de: Khronos14 en 30 Diciembre 2011, 00:12 AMLos 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

Sagrini

#7
Edito: La última solución me parece la mejor y más correcta. Gracias! ;)

El_Java

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 (cpp) [Seleccionar]
#include <cstdio>

int main(){
    cout << "Hola" << endl;
    for(int x=0; x<10; x++){
        printf("%c[1A \rProgreso: %d\n", 033, x);
        #ifdef _WIN32
        #include <Windows.h>
            Sleep(250);
        #else
            sleep(1);
        #endif
    }
    return 0;
}


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