Forum: Ders Arası RSS
dout.write
Sayfa:  1  2  sonraki 
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: dout.write
Ya dosyalarda ilgili derslerin çözümünde ufak bir hata var:
  dout.write ("Dosya ismi? ");

dout.writef olacak. Ya da dout.write abuk subuk karakterler basıyor. Örneğin şu programda diğerleri doğru çalışırken dout.write abuk subuk karakterler basıyor..

import std.cstream;
import std.stream;
import std.stdio;
 
void main ()
{
    writeln ("merhaba");
    dout.writef ("nasılsın");    
    
    dout.write ("iyimisin")}
Avatar
esatarslan52 (Moderatör) #2
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Windowsta denediğim dout.write ("iyimisin");  doğru karakterleri ekrana basıyor fakat her harf arasında bir karakterlik boşluklar bırakıyor.Aynısı bunun için de dout.write ("Dosya ismi? "); geçerli.
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
Ayrıca ilk soru da çalışması gerektiği gibi çalışmıyor gibi görünüyor. Örneğin ilk satırı boş olan bir metin dosyasından okuyup da birleştirmeye çalışınca nedense ilk satırı es geçiyor. İlk satırı göz önünde bulundurmuyor.

Örnek bir dosya öğrenciler.txt
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
esatarslan52:
Windowsta denediğim dout.write ("iyimisin");  doğru karakterleri ekrana basıyor fakat her harf arasında bir karakterlik boşluklar bırakıyor.Aynısı bunun için de dout.write ("Dosya ismi? "); geçerli.

dout.write utf-8 kodlaması kullanan bir sayfada diğerleri doğru çalışırken yanlış karakterler basıyor. (denemek için chcp 65001) Gene de bu windows'un utf-8 kodlamasıyla ilgili olabilir. Ama ilginç nokta diğer işlevler Türkçe karakterleri doğru basarken dout.write yanlış basıyor. Bu önemsiz windows'un taş devrinden kalan konsol sisteminden kaynaklanıyor olabilir. Ama benim asıl merak ettiğim programda üstte verdiğim gibi bir hata olup olmadığıydı.
Avatar
esatarslan52 (Moderatör) #5
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu önemsiz windows'un taş devrinden kalan konsol sisteminden kaynaklanıyor olabilir.
Evet ondan olabilir.
Ama benim asıl merak ettiğim programda üstte verdiğim gibi bir hata olup olmadığıydı.
Bende öyle bir hata vermedi sadece karakterler arasında boşluk varıdı.
erdem (Moderatör) #6
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
esatarslan52:
Bende öyle bir hata vermedi sadece karakterler arasında boşluk varıdı.

Normal konsolda bahsettiğin gibi boşluklarla yazıyor. Ama benim yazdığım kaynak kodu UTF-8 ve UTF kodlamasını konsolda doğru gösterebilmek için chcp 65001 yapıyorum. Gene de linuxta doğru çalışıyorsa büyük ihtimal sorun yoktur :)
acehreli (Moderatör) #7
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ı
Başkasını suçlamayın! Bu sefer hata bende... :)

std.stream.write, bayt bayt yazar; evet, writef olması gerekiyormuş. Çünkü ben ara belleği olduğu gibi çıkışa aktarmak değil, insanın okuyabileceği şekilde formatlı olarak istiyordum. (Gerçi bu dizgi için bunun neden farkettiğini anlamış değilim.)

Bundan sonra çok daha dikkatli olmalıyım. Tek bir harf yüzünden ve şanssızlığıma dizginin içinde Türkçe harf bulunmadığından benim ortamımda düzgün çalışıyor ama sizde olmadı. :(

Programı writef olarak düzelttim...

Erdem, ilk satırın boş olması sorununu da burada göremiyorum. Acaba prevCr ("önceki readLine bir satır sonunda durdu" anlamındaymış) kullanarak bir şeyler yapabilir misin:

  http://digitalmars.com/d/2.0/phobos/std_stream.html#prevCr

Yani acaba o fonksiyonun işlevi zaten böyle durumlar mı?

Ali
erdem (Moderatör) #8
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Erdem, ilk satırın boş olması sorununu da burada göremiyorum. Acaba prevCr ("önceki readLine bir satır sonunda durdu" anlamındaymış) kullanarak bir şeyler yapabilir misin:

İlginç linux altında bu öğrenciler.txt dosyası ile doğru çalışıyor mu? Ben windows altında deniyorum hep aynı sonucu veriyor. Sonuç dosyasında ilk satır hep boş. Acaba akımın başka bir durumu boşluk karakteri basabilir mi? Ya da acaba kullandığımız FileMode.OutNew örneğin dosya oluştururken bir tane boşluk karakteri mi basıyor? Windows altında da birisi programın doğru çalışıp çalışmadığını doğrulayabilir mi?
acehreli (Moderatör) #9
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ı
Erdem, program:

import std.cstream;
import std.stream;
 
void main()
{
    File giriş = new File("ogrenciler.txt", FileMode.In);
 
    while (!giriş.eof()) {
        char[] satır = giriş.readLine();
 
        dout.writefln("==|", satır, "|== ", satır.length);
    }
}

ogrenciler.txt (hem başta hem sonda tek boş satır, ve karıştırmasın diye hep ASCII):


birinci
ikinci

ucuncu



çıktı:

==||== 0
==|birinci|== 7
==|ikinci|== 6
==||== 0
==|ucuncu|== 6
==||== 0


Sende nasıl?

Ali
erdem (Moderatör) #10
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Kodumuz şu şekilde:

import std.cstream;
import std.stream;
 
void main()
{
    dout.writef("Dosya ismi? ");
    char[] girişDosyasıİsmi;
    din.readf(&girişDosyasıİsmi);
 
    File giriş = new File(girişDosyasıİsmi.idup, FileMode.In);
 
    char[] çıkışDosyasıİsmi = girişDosyasıİsmi ~ ".bak";
 
    File çıkış = new File(çıkışDosyasıİsmi.idup,
                          FileMode.OutNew);
 
    while (!giriş.eof()) 
        {
        char[] satır = giriş.readLine();
 
        if (satır.length != 0) {
            çıkış.writefln(satır);
        }
    }
 
    dout.writefln(çıkışDosyasıİsmi, " dosyasını oluşturdum");
}

ogrenciler.txt (girdi dosyası):
// boşluk
birinci
ikinci

// boşluk
ucuncu
// boşluk

ogrenciler.txt.bak (çıktı dosyası):
// boşluk
birinci
ikinci
ucuncu
erdem (Moderatör) #11
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #9
acehreli:
çıktı:

==||== 0
==|birinci|== 7
==|ikinci|== 6
==||== 0
==|ucuncu|== 6
==||== 0


Sende nasıl?

Ali

Çıktı şu şekilde:

==||== 3
==|birinci|== 7
==|ikinci|== 6
==||== 0
==|ucuncu|== 6
==||== 0
==||== 0


fazladan bir üç var :)
acehreli (Moderatör) #12
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ı
Anlaşıldı! :)

O üç karakter şunlar herhalde: 239 187 191 (EF BB BF).

Onlar UTF-8 BOM (byte order mark) karakterleri...

Bu konuda siz haklı çıktınız: DOS penceresi UTF-8'ten habersiz olduğu için, Erdem'in dosyasının başındaki UTF-8 belirteçlerini de dosyanın parçası olarak alıyor.

Erdem, bir çözüm olarak belki dosyayı oluşturduğun metin düzenleyiciye BOM koymamasını söyleyebilirsin. Öyle bir ayarı olabilir.

Diğer çözüm de UTF-8'ten anlayan bir ortamda çalışmak... :-p

Ali
acehreli (Moderatör) #13
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ı
Birilerini suçlamayı bıraksam iyi olacak! :( (DOS'u, Windows'u, ve Microsoft'u suçlamak alışkanlık olmuş. :) )

Dosya başında BOM karakterleriyle ilgili gibi görünen EndianStream var. Onun readBOM() fonksiyonunu kullanmak gerekiyor olabilir. Şimdi bir de EndianStream'i ve onun türetildiği FilterStream'i filan da mı anlatmak gerekecek? :( :)

Ali
erdem (Moderatör) #14
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet gayet güzel olur.. Bu arada editör olarak 'Not Defteri' kullanıyorum  :-)
erdem (Moderatör) #15
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #12
acehreli:
O üç karakter şunlar herhalde: 239 187 191 (EF BB BF).

Onlar UTF-8 BOM (byte order mark) karakterleri...

==||== 0
==|birinci|== 7
==|ikinci|== 6
==||== 0
==|ucuncu|== 6
==||== 0
==||== 0


Dosyanın karakter kodlamasını ANSI olarak değiştirince de bu çıktıyı veriyor. Sonda fazladan bir sıfır var. Gerçekten dosyanın karakter kodlamasını ANSI olarak değiştirince de ilk satırı birleştirememe hatasını da vermiyor.
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:
Sayfa:  1  2  sonraki 
Forum: Ders Arası RSS
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-19, 00:47:03 (UTC -08:00)