25 Şubat 2014 Salı

C Programlama Dilinde Komut Satırından Programa Parametre Geçirmek


int argc ve char *argv[] parametreleri kullanılarak, komut satırından main fonksiyonuna argüman geçirmek mümkündür.


argc parametresi à komut satırından programa geçirilecek parametrelerin sayısını alır.
argv parametresi à komut satırı argümanlarının depolandığı string dizisidir.

Komut Satırı Argümanlarının Kullanımındaki Genel Amaçlar: 

1. Fonksiyonel programlara, programın ihtiyaç doğrultusunda kullanılması için kontrol kodu geçirmek, 

2. Dosya isimlerini programa geçirerek dosyalar üzerinde çalışmak.


Uygulama 1: Fonksiyonel programlara, programın ihtiyaç doğrultusunda kullanılması için kontrol kodu geçirerek, basit matematiksel ifadeler arasında tercih hakkının, komut satırından girilen önceden belirlenmiş anahtar ifadeler aracılığıyla gerçekleştirilmesi amaçlanmıştır. 

#include <stdio.h>
#include <stdlib.h> // atoi() fonksiyonunun prototipinin bulunduğu header.
#include <conio.h>

int main(int argc, char *argv[])
/*
    main() fonksiyonumuz komut satırından, bir tamsayı değişkeni bir de
    karakter dizisi almaktadır. Ana fonksiyonumuz, programın doğru 
    çalışıp çalışmadığını idrak edebilmemiz açısından komut satırına bir tamsayı
    değeri döndürmek üzere programlanıyor.
*/
   
{
    int sayi1, sayi2;
    char secim, karakter, *dizi;
    double sonuc;

    /*
        --------------- Programın kullanımı ---------------
              Komut istemine girilecek verinin turu
             
                  [sayi1]  [islem_turu]  [sayi2]
                   
                          İslem Türleri
                           
         '+' --> Toplama\n '-' --> Çıkartma\n '*' --> Çarpma\n '/' --> Bölme
       
          Örneğin:
          Komut Satırı -->
          C:\Users\sercan\desktop\argumanGecirme.exe 4 * 6
   
        ---------------------------------------------------
    */
   
   
    if(argc < 4)
    // Komut satırından gelen parametrelerin adedi test ediliyor..
    {
        printf("Eksik Arguman Girdiniz..");
    }
       
    else if(argc < 4)
    // Komut satırından gelen parametrelerin adedi test ediliyor..
    {
        printf("Fazla Arguman Girdiniz..");
    }

    if(argc == 4)
    {
        /*
            argv[1] --> komut satırından girilen ilk parametredir.
           
                        ----- Komut Satırı -----
           
            C:\Users\sercan\desktop> argumanGecirme.exe 3 / 45
           
                        ------------------------
                    
            argv[1] = "34"
            argv[2]= "/"
            argv[3]= "45"
            argc = 4               
                       
                        >>> Değerini alır.
            Burada dikkat etmemiz gereken nokta, argv dizisinin char tipinde
            olduğudur. Bu nedenle atoi() fonksiyonunu kullanarak tamsayı tipine
            dönüşüm işlemi gerçekleştirilir. 
        */         
           
           
           
       
        /*
            Komut satırından programımıza dahil edilen değerler string ifade
            olduğundan atoi() fonksiyonu aracılığıyla tamsayı tipine
            dönüşüm işlemi gerçekleştirilir.
         
        */

        sayi1 = atoi(argv[1]);
        // atoi() fonksiyonu string ifadeleri int veri tipine dönüştürür.
        dizi argv[2];
        /*
         'karakter'değişkeni char tipinde tanımlanmıştır. 
          Değişkenin tutacağı değerler -->          '+' , '-' , '*' , '/'
        */
        sayi2 = atoi(argv[3]);
        

        karakter = dizi[0];
       
        switch(karakter)
        {
            case '+':
                printf("%d + %d = %d\n\n", sayi1, sayi2, (sayi1 + sayi2));
                break; 
           
            case '-':
                printf("%d - %d = %d\n\n", sayi1, sayi2, (sayi1 - sayi2));
                break;
           
            case '*':
                printf("%d * %d = %d\n\n", sayi1, sayi2, (sayi1 * sayi2));
                break;
           
            case '/':    
                printf("%d / %d = %.2f\n\n", sayi1, sayi2, ((float)sayi1 / (float)sayi2));
                break;
            default:
                printf("Yanlis bir parametre girdiniz..");
                break;
        }
    }
   
    getch();
    return 1;
}
C kaynak kodu, masaüstü dizinine kaydedilip derlendiğinde yine aynı dizinde çalıştırılabilir dosya (.exe) oluşturulduğunu gözlemleriz. Çalıştırılabilir dosya üzerine farenin sol tuşu ile çift tıklanıp çalıştırılmak istendiğinde;
Şekil 1.1

Programa parametre göndermediğimizden, yeterli sayıda parametre alınamadığına dair bir mesajla karşılaşırız. C kaynak kodumuzun ilgili satırlarındaki aşağıdaki kod bu işlemin gerçekleşmesini organize eder. 
    if(argc < 4)
    // Komut satırından gelen parametrelerin adedi test ediliyor..
    {
        printf("Eksik Arguman Girdiniz..");
    }

 Programa parametre göndermek için [Windows] + [R] tuş kombinasyonunu kullanarak Windows'un 'Çalıştır' arayüzünü görüntüleyelim. 'Çalıştır' arayüzüne 'cmd' komutunu yazarak komut satırını görüntüleyelim. C:\Windows\system32 dizininde bulunan cmd.exe dosyasını çalıştırarak bu işlemi farklı bir yolla da gerçekleştirebiliriz. 

Şekil 1.2
Çalıştırılabilir dosyamız (argumanGecirme.exe) masaüstü dizininde kayıtlı olduğundan, komut satırından ilgili dosyayı çalıştırabilmek için masaüstü dizinine geçmek gerekir. C kaynak kodumuzu argumanGecirme.c adıyla kaydettiğimizden, derleme işlemi sonucu oluşan çalıştırılabilir dosyanın (.exe) adı da argumanGecirme.exe olacaktır. DOS'da dizinler arası dolaşmak için  'cd' komutu kullanılır. 
Şekil 1.3

Komut satırından dosyamızı sağlıklı bir şekilde çalıştırabilmek için, kaynak kodda belirttiğimiz şekilde parametre girişi yapmamız gerekmektedir. 

Şekil 1.4


     /*
                    --------------- Programın kullanımı ---------------
                         Komut istemine girilecek verinin turu
             
                             [sayi1]  [islem_turu]  [sayi2]
                   
                                     İslem Türleri
                           
             '+' --> Toplama\n '-' --> Çıkartma\n '*' --> Çarpma\n '/' --> Bölme
       
          
            Komut Satırı -->  C:\Users\sercan\desktop\argumanGecirme.exe 4 * 6
   
                     ---------------------------------------------------
    */


2. Dosya İsimlerini Programa Geçirerek Dosyalar Üzerinde Çalışma: int argc ve char *argv[] parametreleri kullanılarak, komut satırı üzerinden programa dosya isimleri geçirmek mümkündür. Aşağıdaki program, dosyalar arası kopyalama yapmak için tasarlanmıştır. Söz konusu programın avantajlarından biri, kopyalama işleminin istenilen iki dosya arasında gerçekleştirilerek programın esnek bir yapıda inşa edilmesine olanak tanımasıdır. char *argv[] parametresi, gerçek komut satırı argümanlarının depolandığı bir string dizisidir. Komut satırından girilen dosya isimleri argv parametresi üzerinden dosya işlemlerinin gerçekleştirilmesi maksadıyla kullanılacaktır.

#include <stdio.h>      // printf() fonksiyonunun prototipinin bulunduğu header.
#include <conio.h>      // getch() fonksiyonunun prototipinin bulunduğu header.
#include <process.h>    // exit() fonksiyonunun protipinin bulunduğu header.

/*
    main() fonksiyonumuz komut satırından parametre almakta ve komut satırına
    tamsayı veri tipinde değer yazdırmaktadır.
*/
int main(int argc, char *argv[])
{
    FILE *orjinalDosya, *kopyaDosya;
    /*
        orjinalDosya ve kopyaDosya adında dosya göstericileri tanımlanıyor.
       
        orjinalDosya --> Kopyalanması düşünülen dosyayı gösterecek dosya göstericisidir.
       kopyaDosya --> Kopyalanan dosya içeriğinin aktarılacağı dosyayı gösteren  dosya           göstericidir.
    */
   
    int deger;
  
    if(argc > 3) 
    // Komut satırından girilen parametre sayısı 3'den fazlaysa programı sonlandır.
        {
            printf("Fazla arguman girildi..");
            exit(-1);
        }
   
    else if(argc < 3) 
    // Komut satırından girilen parametre sayısı 3'den az ise programı sonlandır.
        {
            printf("Eksik arguman girildi..");
        }
       
    else // Komut satırından girilen paramtre sayısı 3 ise programı çalıştır.
    {
    
         orjinalDosya = fopen(argv[1], "r");
         /*
             Komut satırından girilen 1. argüman string ifade olup, orjinal dosya 
             göstericisi işlevine sahiptir. orjinalDosya, dosya göstericisi 
             dosyayı okuma modunda açmaktadır.
         */
        
         if(orjinalDosya == NULL)
         /*
            fopen() fonksiyonu dosyayı açamadığı takdirde NULL değer döndürür. Eğer
            dosya herhangi bir nedene bağlı olarak açılamazsa komut satırına bilgi
            mesajı yazarak programı sonlandır.
        */
             {
                printf("Komut satirindan girdiginiz dosya okuma modunda acilamadi\n\n");
                exit(-1);
             }
        
         else 
      /*
          Dosya başarılı bir şekilde okuma modunda açıldığında aşağıdaki kod satırı                 işletilir.
      */
             {
                kopyaDosya = fopen(argv[2], "w");
                /*
                    Komut satırından giilrne 2. argüman string ifade olup, kopya dosya
                    göstericisi işlevine sahiptir. kpyaDosa, dosya göstericisi dosyayı
                    yazma modunda açmaktadır.
                */
               
                 if(kopyaDosya == NULL)
              /*
                 fopen() fonksiyonu dosyayı açamadığı takdirde NULL değer döndürür. Eğer
                 dosya herhangi bir nedene bağlı olarak açılamazsa komut satırına bilgi
                 mesajı yazarak programı sonlandır.
              */
             {
               printf("Komut satirindan girdiginiz dosya yazma modunda acilamadi\n\n");
               fclose(orjinalDosya);
               // Öncesinde açılmış dosya kapatılıyor.
               exit(-1);
             }
                
                 else
                 /*
                    Her iki dosyada başarılı bir şekilde açıldığında aşağıdaki
                    kod bloğu çalıştırılarak orjinal dosya içindeki karakterler
                    tek tek diğer dosyaya yazdırılır.
                */
                     {
                        while((deger = fgetc(orjinalDosya)) != EOF)
                            fputc(deger, kopyaDosya);
                     }
                fclose(orjinalDosya);
                fclose(kopyaDosya);
             }
    }
    getch();
    return 1;
}



C kaynak kodu başarılı bir şekilde derlendiğinde (C kaynak kodumuzu masaüstü dizinine kaydettiğimizde, programın başarılı bir şekilde derlenmesi sonucu oluşan çalıştırılabilir dosya da masaüstü dizininde derleyici tarafından oluşturulur.) vücut bulan çalıştırılabilir dosyayı (.exe) komut satırı üzerinden işletebilmek için, masaüstü dizinine iki adet dosya oluşturalım; bu dosyalardan birine (orjinal.txt) manuel olarak herhangi bir veri yazdıralım ve kaydedelim.

Şekil 1.5
orjinal.txt ve kopya.txt metin dosyaları üzerinde hiçbir değişiklik yapmadan kaydederek kapatalım. Akabinde [Windows] + [R] tuş kombinasyonlarına tıklayarak Windows'un çalıştır arayüzünü görüntüleyelim. Çalıştır arayüzüne 'cmd' komutunu girerek komut satırını görüntüleyelim. Çalıştırılabilir dosyamız masaüstü dizininde olduğundan 'cd desktop' komutunu, komut isteminde çalıştırarak masaüstü dizinine geçiş yapalım. Konsola aşağıdaki kodu yazarak programımızı çalıştıralım:

                     C:\Users\sercan\Desktop>argumanGecirme.exe orjinal.txt kopya.txt

(Windows'da masaüstü dizini için izlenen yol ve programın argümanları bir üst satırda verildi. Bu direktifte dikkat etmeniz gereken nokta, 'sercan' ibaresinin sizin bilgisayarınızda görüntülenemeyecek olmasıdır. Çünkü söz konusu ibare şahsi oturum adıdır.)

Ardından komut penceresine yazdığımız isteği çalıştırmak için enter tuşuna tıklayarak orjianal.txt ve kopya.txt dosyalarımızı içerik kontrolü amacıyla tekrar açalım.
Şekil 1.6
Dosya içerikleri incelendiğinde, orjinal.txt adlı metin dosyası içindeki verilerin kopya.txt metin dosyası içine yazdırıldığını göreceksiniz. Böylelikle ikiden çok dosya üzerinde yapılacak benzer işlemler kaynak kodda değişikliğe gidilmeden komut konsolu üzerinden rahatlıkla çalıştırılabilir. 

Hiç yorum yok:

Yorum Gönder