برنامه نویسی C در لینوکس
برای انجام بخشی از یک پروژه نیاز بود تا از زبان سی استفاده کنم. برای مرور این زبان به کتاب جعفر نژاد قمی که از دوران دانشگاه (سال ۱۳۸۷) برام به یادگار مونده بود رجوع کردم. اون زمان از ویندوز و کامپایلر turbo-C استفاده میکردم. این کامپایلر از هدر <conio.h> پشتیبانی میکرد. اما در کامپایلر GCC این کتابخانه در دسترس نیست. در نتیجه ما در لینوکس به توابعی مانند gotoxy , clrscr و getche و getch دسترسی نداریم. خب من میخوام در این نوشته نحوه تعریف این توابع رو به شما آموزش بدم.
تابع gotoxy برای GCC Linux
گاهی ممکنه نیاز باشه در صفحه ی خروجی مکان نما رو به نقطه ی خاصی انتقال بدیم. برای این منظور از تابع gotoxy استفاده میشه. الگوی این تابع در فایل conio.h وجود داره که همونطور که گفته شد در لینوکس پشتیبانی نمیشه. خب پس ما میتونیم این تابع رو خودمون تعریف کنیم. برای تعریف این تابع به شرح زیر عمل کنید:
12345//gotoxy() function definition void gotoxy(int x,int y) { printf("%c[%d;%df",0x1B,y,x); }
خب یه مثالش این میتونه باشه:
12345678910111213141516#include<stdio.h> void gotoxy(int x,int y) { printf("%c[%d;%df",0x1B,y,x); } int main () { int x=10, y=20; gotoxy(x,y); printf("my email is: [email protected]!"); return 0; }
خروجی:
تابع clrscr برای GCC Linux
برای پاک کردن اسکرین ما میتونیم از دستورات ترمینال لینوکس استفاده کنیم:
1234567891011121314#include<stdio.h> //clrscr() function definition void clrscr(void) { system("clear"); } int main () { clrscr(); //clear output screen printf("Hello. I am sh4rifi!!!"); //print message return 0; }
خروجی:
تابع getch و getche برای GCC Linux
تابع getch عمل خواندن اطلاعات رو بدون اکو انجام میده. یعنی توی اسکرین نمایشش نمیده. تابع getche هم کار تابع getch رو همراه با اکو انجام میده. یعنی کاراکتر وارد شده رو در اسکرین چاپ میکنه.
به مثال زیر توجه کنید:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859#include <termios.h> #include <stdio.h> static struct termios old, new; /* Initialize new terminal i/o settings */ void initTermios(int echo) { tcgetattr(0, &old); //grab old terminal i/o settings new = old; //make new settings same as old settings new.c_lflag &= ~ICANON; //disable buffered i/o new.c_lflag &= echo ? ECHO : ~ECHO; //set echo mode tcsetattr(0, TCSANOW, &new); //apply terminal io settings } /* Restore old terminal i/o settings */ void resetTermios(void) { tcsetattr(0, TCSANOW, &old); } /* Read 1 character - echo defines echo mode */ char getch_(int echo) { char ch; initTermios(echo); ch = getchar(); resetTermios(); return ch; } /* Read 1 character without echo getch() function definition. */ char getch(void) { return getch_(0); } /* Read 1 character with echo getche() function definition. */ char getche(void) { return getch_(1); } int main(void) { char c; printf("(getche example) Please enter a character: "); c = getche(); printf("\nYou entered: %c\n", c); printf("(getch example) Please enter a character: "); c = getch(); printf("\nYou entered: %c\n", c); return 0; }
خروجی: