اطلاعیه

Collapse
No announcement yet.

یه سوال در مورد نحوه اجرا

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    یه سوال در مورد نحوه اجرا

    سلام دوستان. یه مشکلی دارم. :sad:
    برنامه زیر رو که با عنوان "چاپ لیست برنامه" داخل یه کتاب بود با Borland Cpp کامپایل کردم و هیچ خطایی نداشت. قبل از هر سوالی اول توضیح برنامه و کدش رو کامل میزارم و بعد سوالم رو میپرسم.
    ================================================== ================================================== ===

    توضیحات: برنامه ای را که ملاحظه میکنید و Print_It نام دارد، لیست برنامه را به همراه شماره خطوط (شبیه آنچه در متن کتب آموزشی برنامه نویسی و یا خود ادیتور کامپایلر مشاهده میکنید،) چاپ میکند.

    نحوه استفاده از این برنامه بصورت روبرو است:
    کد:
    print_it filename.ext
    آنچه چاپ خواهد شد همان دستورات فایل filename.ext (به عنوان مثال) بعلاوه شماره خطوط می باشد.

    کد برنامه:

    کد:
    /*PRINT_IT.c--This program prints out a listing with line numbers! */
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    void do_heading(char *filename);
    
    int line, page;
    
    int main( int argv, char *argc[] )
    {
    	char buffer[256];
     FILE *fp;
    
     if( argv < 2 )
     {
     	fprintf(stderr, "\nProper Usage is: ");
       fprintf(stderr, "\n\nPRINT_IT filename.ext\n" );
       exit(1);
     }
    
     if (( fp = fopen (argc[1], "r")) == NULL )
     {
      fprintf (stderr, "Error Opening file, %s!" , argc[1] );
      exit(1);
     }
    
     page=0;
     line=1 ;
     do_heading (argc[1]);
     while (fgets (buffer, 256, fp)!=NULL)
    	{
     	if (line % 55==0)
       do_heading (argc [1]);
    
       fprintf (stdout, "%4d:\t%s", line++, buffer);
     }
    
     fprintf (stdout, "\f");
     fclose(fp);
     getch ();
     return 0;
    }
    
    void do_heading (char *filename)
    {
    	page++;
    
     if (page>1)
     	fprintf (stdout, "\f");
    
     fprintf (stdout, "Page: %d, %s\n\n", page, filename);
    }

    >> حالا سوال من اینجاست، که با استفاده از این برنامه چجوری میتونم کاری رو انجام میده (یعنی نمایش متن یه برنامه دیگه روی صفحه Command Prompt )، رو انجام بدم؟ به عبارت دقیقتر وقتی فایل exe ای که در نتیجه کامپایل همین برنامه ای که کدش رو قرار دادم رو اجرا میکنم، هیچ چیزی مشاهده نمیکنم و یه لحظه صفحه داس میاد و میره. البته این مورد رو مثل وقتایی که این اشکال پیش میاد میخواستم با include کردن هدرفایل conio.h و اضافه کردن () getch قبل از دستور return حل کنم تا صفحه Command Prompt ثابت بمونه که بازم نشد. (در صورتی که برنامه هایی که اینجوری بودن و این مشکل رو دارن و این کار رو باهاشون میکنم حل میشه.) :cry:

    به طور کلی هم میخوام بدونم چجوری باید با این برنامه کار کرد. یعنی اون دستور
    کد:
    print_it filename.ext
    رو کجا باید وارد کنم؟ :question:

    #2
    پاسخ : یه سوال در مورد نحوه اجرا

    دوست عزیز

    یه نگاه به تابع main بنداز:
    کد:
    int main( int argv, char *argc[] )            x

    در حالت عادی ما تابع main را بدون هیچ آرگومان ورودی می نویسیم. ولی در اینجا دارای دو پارامتر ورودی هستیم. یکی argv از نوع int و دیگری argc از نوع char

    قبل از اینکه بخوام راجع به اینا توضیح بدم، یه مثال میزنم:

    حتما با فرمان format کار کردی. مثلا وقتیکه میخواستیم درایو A رو فرمت کنیم اینطوری می نوشتیم:
    کد:
    format a:       x

    فرمت نام یه فایل هست که جلوش یه مقداری گرفته میشه مثل نام درایو.

    شیوه کار برنامه ای که اینجا گزاشتی هم همینطوریه!

    این برنامه رو با نام print_it.c ذخیره کن و کامپایل کن تا فایل print_it.exe رو بسازه. بعد توی command نام این فایل رو بنویس و جلوش فایلی باشه که میخوای محتویاتش نشون داده بشه مثل این:
    کد:
    print_it.exe print_it.c           x

    وقتیکه اینتر میزنی و برنامه اجرا میشه، تابع main فراخوانی میشه. برنامه تابع main هم دارای اون دو آرگومان هست. که وظیفه این دو پارامتر اینه که ببینه آیا جلوی نام فایل اجرایی چیزی نوشته شده یا نه! یعنی آیا print_it.exe اجرا شده یا print_it.exe file.ext اومده؟!

    خوب اگه چیزی نوشته شده باشه تعدادش در متغیر argv میاد و محتویاتش در argc

    فرض کن که این فایل رو بدون هیچ مقداری در جلوی نام فایل اجرایی، اجرا میکنی. مقدار argv برابر 1و argc هم برابر print_it.exe.

    برنامه اینو چک میکنه:
    کد:
      if( argv < 2 )         x
      {
     	fprintf(stderr, "\nProper Usage is: ");         x
       fprintf(stderr, "\n\nPRINT_IT filename.ext\n" );         x
       exit(1);         x
      }

    اینطوری چک میکنه که آیا جلوی فایل چیزی وارد کردی یا نه! اگه نه اون پیغامها رو میده و با دستور exit از برنامه خارج میشه! دستور getch رو باید قبل از exit بزاری نه return تابع main

    خوب فرض کن که یه فایلی جلوی print_it .exe وارد کردی پس شرط برقرار نیست و برنامه با دستور fopen فایل رو باز میکنه:
    کد:
    if (( fp = fopen (argc[1], "r")) == NULL )       x

    نام فایلی که در جلوی اجرایی نوشتی در Argc هست. توجه کن که مقدار اندیس صفر artgc همون print_it .exe هست و مقدار اندیس 1 همون نام فایلی هست که بهش میدی. پس در فرمان fopen میبینی که مقدار اندیس 1 رو داده تا فایل رو در حالت فقط خواندنی باز کنه. مثل همون مثال فرمت!

    حالا اگه جلوی فایل اجراییت 100 تا فایل و سوئیچ و... بنویسی، به ترتیب در Argc قرار میگیرن و مقدارشون هم در argv

    امیدوارم این مطالب به دردت بخوره...

    موفق باشی...
    http://ceworld.ir/images/ads/dornablogcom_ads.gif

    دیدگاه

    لطفا صبر کنید...
    X