D Programlama Dili – Programlama dersleri ve D referansı
Ali Çehreli

akım: [stream], nesnelerin art arda erişildiği giriş çıkış birimi
standart çıkış: [standard output], program çıktısının normalde gönderildiği akım
standart giriş: [standard input], program girişinin normalde okunduğu akım
uç birim: [terminal], bilgisayar sistemlerinin kullanıcıyla etkileşen giriş/çıkış birimi; "konsol", "komut satırı", "cmd penceresi", "DOS ekranı", vs.
... bütün sözlük



İngilizce Kaynaklar


Diğer




Standart Akımları Dosyalara Bağlamak

Önceki bölümlerdeki programlar hep standart giriş ve çıkış akımları ile etkileşiyorlardı. D'nin standart akımlarının stdin ve stdout olduklarını görmüştük, ve açıkça akım bildirmeden çağrılan writeln gibi işlevlerin de arka planda bu akımları kullandıklarını öğrenmiştik. Ek olarak, standart girişin hep klavye olduğu, ve standart çıkışın da hep ekran olduğu durumlarda çalışmıştık.

Bundan sonraki bölümde programları dosyalarla etkileşecek şekilde yazmayı öğreneceğiz. Dosyaların da karakter akımı olduklarını, ve bu yüzden standart giriş ve çıkışla etkileşmekten bir farkları olmadıklarını göreceksiniz.

Dosya akımlarına geçmeden önce, programcılık hayatınızda çok işinize yarayacak başka bir bilgiyi bu bölümde vermek istiyorum: programınızın standart giriş ve çıkışını, sizin kodunuzda hiçbir değişiklik gerekmeden dosyalara bağlayabilirsiniz. Programınız ekran yerine bir dosyaya yazabilir, ve klavye yerine bir dosyadan veya bir programdan okuyabilir. Bu, bütün modern uç birimlerin hepsinde bulunan ve programlama dilinden bağımsız bir olanaktır.

Standart çıkışı > ile bir dosyaya bağlamak

Programınızı bir uç birimden başlatıyorsanız, programı çalıştırmak için yazdığınız komutun sonuna > karakterinden sonra bir dosya ismi yazmanız, programın standart çıkış akımının o dosyaya bağlanması için yeterlidir. Bu durumda, programın standart çıkışına yazdığı herşey o dosyaya yazılır.

Standart girişinden bir sayı alan, o sayıyı 2 ile çarpan, ve sonucu standart çıkışına yazdıran bir program düşünelim:

import std.stdio;

void main() {
    double sayı;
    readf(" %s", &sayı);

    writeln(sayı * 2);
}

O programın isminin iki_kat olduğunu varsayarsak, programı komut satırından

./iki_kat > iki_kat_sonucu.txt

şeklinde başlatır ve girişine örneğin 1.2 yazarsanız, programın çıktısı olan 2.4'ün ekrana değil, iki_kat_sonucu.txt ismindeki bir dosyaya yazıldığını görürsünüz. Not: Bu program baştan "Lütfen bir sayı giriniz: " gibi bir mesaj yazmadığı halde, siz yine de sayıyı klavyeden yazıp Enter'a basmalısınız.

Standart girişi < ile bir dosyaya bağlamak

Çıkışın > karakteriyle bir dosyaya bağlanmasına benzer şekilde, giriş de < karakteriyle bir dosyaya bağlanabilir. Bu durumda da girişinden bilgi bekleyen bir program klavyeden okumak yerine, belirtilen dosyadan okur.

Bu sefer de elimizde girişinden aldığı sayının onda birini hesaplayan bir program olsun:

import std.stdio;

void main() {
    double sayı;
    readf(" %s", &sayı);

    writeln(sayı / 10);
}

Eğer iki kat alan programın oluşturduğu dosya hâlâ klasörde duruyorsa, ve bu programın isminin de onda_bir olduğunu varsayarsak, programı komut satırından

./onda_bir < iki_kat_sonucu.txt

şeklinde başlatırsanız, girişini daha önce oluşturulan iki_kat_sonucu.txt dosyasından aldığını ve çıkışa 0.24 yazdırdığını görürsünüz. Not: iki_kat_sonucu.txt dosyasında 2.4 olduğunu varsayıyorum.

onda_bir programı; ihtiyacı olan sayıyı artık klavyeden değil, bir dosyadan okumaktadır.

Giriş ve çıkış akımlarının ikisini birden dosyalara bağlamak

> ve < karakterlerini aynı anda kullanabilirsiniz:

./onda_bir < iki_kat_sonucu.txt > butun_sonuc.txt

Bu sefer giriş iki_kat_sonucu.txt dosyasından okunur, ve çıkış da butun_sonuc.txt dosyasına yazılır.

Programları | ile birbirlerine bağlamak

Yukarıda kullanılan iki_kat_sonucu.txt dosyasının iki program arasında aracılık yaptığına dikkat edin: iki_kat programı, hesapladığı sonucu iki_kat_sonucu.txt dosyasına yazmaktadır, ve onda_bir programı da ihtiyaç duyduğu sayıyı iki_kat_sonucu.txt dosyasından okumaktadır.

| karakteri, programları böyle bir aracı dosyaya gerek olmadan birbirlerine bağlar. | karakteri, solundaki programın standart çıkışını sağındaki programın standart girişine bağlar. Örneğin komut satırında birbirine şu şekilde bağlanan iki program, toplu olarak "beşte bir" hesaplayan bir komut haline dönüşür:

./iki_kat | ./onda_bir

Önce iki_kat programı çalışır ve girişinden bir sayı alır. Not: O programın "Lütfen bir sayı giriniz: " gibi bir mesaj yazmadığını hatırlayın; siz yine de sayıyı klavyeden yazıp Enter'a basmalısınız.

Sonra, iki_kat programının çıkışı onda_bir programının girişine verilir ve iki katı alınmış olan sayının onda biri, yani baştaki sayının "beşte biri" çıkışa yazılır.

Problem

İkiden fazla programı art arda bağlamayı deneyin:

./birinci | ./ikinci | ./ucuncu