[C] Is there a way to clean half screen?


 
Thread Tools Search this Thread
Top Forums Programming [C] Is there a way to clean half screen?
# 1  
Old 03-28-2011
[C] Is there a way to clean half screen?

Hi,
I wrote a program for Windows environment. It shows a menu to choice some operations to do. Once an operation is done, it cleans the screen with a system("cls") call, and the menu is shown again.

I'd like to just clean half screen, so the program doesn't need to call again the print menu procedure.

I read there was something like this:

Code:
gotoxy(x,y);
clreol();

But I also read it is deprecated?

Is there any function or way to do this in C?

Are there operating systems which system calls allow to do this?

Thanks in advance.

Last edited by Luke Bonham; 03-28-2011 at 06:05 AM..
# 2  
Old 03-28-2011
It's not "depreciated" -- C never had it. I don't think Windows ever had it, either. Certain odd compilers like Borland's may have provided it through a nonstandard library and conio.h, and now you're learning what "portable" means.

Fortunately since you're printing to an actual terminal that understands actual escape sequences, nothing prevents you from [url=https://www.unix.com/302356413-post3.html]making your own[/url]. Just print the right characters and your terminal, if capable, should obey it.

[url=http://ascii-table.com/ansi-escape-sequences.php]here's[/url] a table of ASCII escape sequences to help you build on the functions I linked above. To clear a line, for example:

[code]void clearline(void)
{
/* The \r moves it to the beginning of the line */
printf("\r\033[K");
}[/code] Also note you may need to fflush() after calling these functions to make sure they're printed to the screen right when you want them to be, instead of after the next newline you print. Or just fprintf(stderr, "..."); instead of printf("..."); so it'll never buffer -- though you actually want it to buffer for less flicker. If anything you might want to make the buffer bigger -- you could print a whole screenful of stuff in individual bits, then fflush(stdout); to redraw in one whack.


Oh, you're in Windows. We do have a windows section but this isn't it.

Last edited by Corona688; 03-28-2011 at 12:37 PM..
# 3  
Old 03-29-2011
chill!

The windows system call stuff was just an example to introduce my question.

I've asked if there's a way to do this in C, standard, independently from the os.

Uhm, we can say my question is portable? ;D


However thanks for the linux tip.

EDIT:

Seems I find a way, but I am not sure this is good:

I found an implementation of gotoxy:

Code:
void  gotoXY(int x, int  y) {
COORD CursorPos = {x, y};
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsole, CursorPos);
}

I put it on an header file and did:

Code:
     int i = 0, j;
     /* some other code here */
     while ( i < n ) /* n stands for number of lines to clear */
     { 
           j = 0;
           while ( j++ < 256 ) putchar(' '); /* 'clean' a line */
           gotoXY(0, i++); /* move to the next line */
     }

The putchars rewrite the stdout buffer, correct?

Is this efficient? If not, how can I do it efficiently?

Last edited by Luke Bonham; 03-29-2011 at 05:51 AM..
# 4  
Old 03-29-2011
There is no standard way of doing this in the C language which is OS independent.
# 5  
Old 03-29-2011
Quote:
Originally Posted by Luke Bonham
The windows system call stuff was just an example to introduce my question.
Quote:
I found an implementation of gotoxy:

Code:
void  gotoXY(int x, int  y) {
COORD CursorPos = {x, y};
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsole, CursorPos);
}

... This is Windows code.

Not that we mind helping Windows users, but obviously you are programming in Windows, and to say you're not interested in Windows code then use Windows calls in the next breath is a little odd.

If you want to do it portably, look for a windows implementation of the curses or ncurses library, you can find curses in most places in UNIX. A bit of a pain to use, but portable.

Last edited by Corona688; 03-29-2011 at 12:08 PM..
This User Gave Thanks to Corona688 For This Post:
# 6  
Old 03-30-2011
Don't know why but I thought it was just C. I didn't know that was windows code. I'm totally uneducated about that.

I learned there's no "standard" way for this. Which is the answer to my question.

However now I've got a way of doing it both in Windows and Linux environment, and also a hint on how could I do it portably.

So thanks for your time. Smilie
Login or Register to Ask a Question

Previous Thread | Next Thread

8 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Command to delete half of files in directory.

Hello Friends, I have directory called /tmp. which stores the log files. Whenever it becomes full, i want to delete half of files from all log files. even after deleting the files, if space is more than 90% then it should delete rest of half files. While deleting files, older files... (7 Replies)
Discussion started by: Nakul_sh
7 Replies

2. UNIX for Dummies Questions & Answers

Accidentally made a screen within a screen - how to move it up one level?

I made a screen within a screen. Is there a way to move the inner screen up one level so that it is at the same level as the first screen running from the shell? (2 Replies)
Discussion started by: phpchick
2 Replies

3. UNIX for Dummies Questions & Answers

[SOLVED] Only half my script runs

Hello out there, I got this script that runs partly fine by my crontab. Problem is it gets to the sleep 300(which should be 5 minutes right?) part and never runs the rest of the scripts past that. All individual scripts run just fine. My var/mail file only shows it up to the " echo "Loader Stop... (3 Replies)
Discussion started by: vsekvsek
3 Replies

4. AIX

Connected and Running with half duplex speed

VIO Server connected to switch port and running with half duplex speed on one of the shared ethernet adapter. We have verified at switch end and everythings looks good. Other ethernet adapter in the VIO server are connected and running in Full duplex speed. Please help me find why this shared... (4 Replies)
Discussion started by: mugunthanvh
4 Replies

5. Red Hat

command line tool to disable screen lock and/or screen saver

Hi, I have a simple question : how to disable screen lock and/or sreen saver with command line with RHEL5.4 ? (1 Reply)
Discussion started by: albator1932
1 Replies

6. OS X (Apple)

Virtual screen accessed by Screen Sharing

Hi, I'm trying to create a virtual screen, (maybe xvfb? or any other virtual screen buffer) and be able to use Screen Sharing to connect to it. The setup is that I have a Mac Mini connected to the TV. But when my girlfriend is using Front Row, I can't use Screen Sharing at the same time from... (0 Replies)
Discussion started by: linge
0 Replies

7. UNIX for Dummies Questions & Answers

Internet half-broken

I have an odd problem with my internet connection. I think it's software not hardware, but I'm not even certain of that. My best guess is that it relates to my recent installation of KVpnc. I can't connect to most websites: no ping, nothing in the browser. But other websites I can connect to... (7 Replies)
Discussion started by: CRGreathouse
7 Replies

8. Shell Programming and Scripting

Script sortof half-working?

I have directories full of files that contain dates and times in their names in the format YYYYMMDDhhmm. So like, one of the files is named 199407271609 with no file extension. I have this script searches a given directory and changes all creation dates of the files to match the date in their... (4 Replies)
Discussion started by: hot_pants
4 Replies
Login or Register to Ask a Question