Forum: D Programlama Dili RSS
din ve dout yerine stdin ve stdout
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: din ve dout yerine stdin ve stdout
std.cstream (ve başka akımlar) Phobos'tan emekliye ayrılacaklarına göre standart giriş/çıkış akımı olarak std.stdio'nun stdin ve stdout'unu kullanmak gerek; değil mi? Bu akımlar C'de de aynı isimdeler.

Aslında serbest olarak yazdığımız writeln ve readln zaten stdout ve stdin'i kullanıyorlar. Örneğin readln'in tanımı şöyle:

string readln(dchar terminator = '\n')
{
    return stdin.readln(terminator);
}

D.ershane'de girişten bilgi almak için henüz aşağıdakindan daha temiz bir şey bulamadım:

import std.stdio;
import std.string;
import std.conv;
 
void main()
{
    write("İsminiz: ");
    auto isim = to!string(strip(readln()));
 
    write("Yaşınız: ");
    auto yaş = to!int(strip(readln()));
 
    writefln("Sevgili %s, ben de haftaya %s yaşımı dolduracağım", isim, yaş);
}

Fazla karmaşık değil, değil mi? readln() satır okuyor; strip, baştaki ve sondaki boşlukları kırpıyor; to da dizgiden belirtilen türe dönüştürüyor. Yani to, format'ın tersi: format string'e dönüştürür; to, string'den dönüştürür. (Aslında to başka türlerden başka türlere de dönüştürür; bir tarafın string olması şart değildir.)

Aslında bir de parse var. parse, dönüşümleri uyguladıkça taramakta olduğu string'i de tüketir:

import std.stdio;
import std.string;
import std.conv;
 
void main()
{
    writeln("Toplanacak sayıların hepsini tek satır olarak girin: ");
    auto satır = strip(readln());
 
    double toplam = 0;
    int adet = 0;
 
    while (satır.length) {
        toplam += parse!double(satır);
        ++adet;
        munch(satır, whitespace);
    }
 
    writefln("%s sayının toplamı %s, ortalamaları %s",
             adet, toplam, toplam / adet);
}

Yukarıdaki programdaki satır, parse tarafından parça parça tüketiliyor. parse'ın belgesinde bir özelliğe dikkat çekmişler: C'nin scanf ailesinden işlevleri, tararken boşlukları atlarlar. parse atlamıyor! Onun için munch'ı kullanarak her adımda dizginin başındaki boşluk karakterlerinden kurtuluyoruz.

Boşluk karakterlerini teker teker kendimiz yazmak yerine de std.string'de tanımlı olan whitespace'i kullanıyoruz. whitespace şöyle tanımlanmış:

immutable char[6] whitespace = " \t\v\r\n\f";           /// ASCII whitespace 

Sırasıyla şu karakterler: boşluk, tab, düşey tab, satır başı, yeni satır, yeni sayfa (form feed).

Ali
canalpay (Moderatör) #2
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bende readln kullanıyorum bazen. Çünkü readln'nın parantez içinde istediğimiz karakteri verip o karakter gelene kadar okuması olsun gösterge ile alakası olmadan değişkene değeri aktarabiliyor olmamız her halükarda çok daha iyi.

Fazla karmaşık değil, değil mi?

Bence karışık değil. Ancak readln'nın parametresinde belirtilen boşluğun eklenmesi bence doğru değil.
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
readln'nın parametresinde belirtilen boşluğun eklenmesi bence doğru değil

'\n' karakterinden mi bahsediyorsun? Onu yazmak zorunda değiliz ama istersek satırın başka bir karakterde sonlanmasını isteyebiliriz. Örneğin gelen ilk 'a'ya kadar okutabiliriz. Esnek yapmışlar ama kullanmaya gerek yok.

Ali
canalpay (Moderatör) #4
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
'\n' karakterinden mi bahsediyorsun? Onu yazmak zorunda değiliz ama istersek satırın başka bir karakterde sonlanmasını isteyebiliriz. Örneğin gelen ilk 'a'ya kadar okutabiliriz. Esnek yapmışlar ama kullanmaya gerek yok.
Biliyorum. readln koduna ben siz d'nin ingilizce forumuna din.readf'den başka ne kullanabiliriz dediğinizde bakmıştım. Ben o karakterin okunan dizgide de olmasını doğru bulmuyorum dedim.

örneğin
string a=readln();
if(a[$-1]=='\n'){
 
    writeln("\n karakterinin eklenmesini doğru bulmuyorum.")
}
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şimdi anladım. Sana katılıyorum. :)

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 13:22:29 (UTC -08:00)