Forum: D Programlama Dili RSS
File File'a karşı
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ı: File File'a karşı
Bir sorun daha... :) Phobos'ta iki tane File var:

1) std.stdio içindeki struct File
2) std.stream içindeki class File

İşin garibi, C++'nın tersine D'de struct ile class oldukça farklı. Nasıl oluşturuldukları bile! Şu programlar ayrı ayrı çalışıyorlar:

import std.stdio;
 
void main()
{
    auto dosya = File("dosya0", "w");
}

ve

import std.stream;
 
void main()
{
    auto dosya = new File("dosya1", FileMode.OutNew);
}

Ama iki modülü birden ekleyince doğal olarak karışıklık oluşuyor; o yüzden uzun isimlerini vermek gerekiyor:

import std.stdio;
import std.stream;
 
void main()
{
    auto dosya0 =     std.stdio.File("dosya0", "w");
    auto dosya1 = new std.stream.File("dosya1", FileMode.OutNew);
}

Tabii typedef oluşturmak da mümkün:

import std.stdio;
import std.stream;
 
typedef std.stdio.File structFile;
typedef std.stream.File classFile;
 
void main()
{
    auto dosya0 =     structFile("dosya0", "w");
    auto dosya1 = new classFile("dosya1", FileMode.OutNew);
}

İngilizce forumda da sordum:

http://www.digitalmars.com/webnews/newsgroups.…?art_grou…

Ali
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet ilginç bir durum acaba çalışma mantıklarında mı bir farklılık var.
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ı
Bu soru Dosyalar bölümünü yazarken karşıma çıktı.

std.stdio'nun içindeki, C'den bildiğimiz FILE'ı sarmalıyormuş. Diğeri ise daha bir akım mantığı ile yazılmış olmalı. (?)

Şimdi baktım; birisi yanıt yazmış "çılgınlık bu" diyor :) ve std.stdio'yu basit giriş/çıkış için önermiş. Ben de D.ershane'de onu artık bırakayım bari...

Ali
acehreli (Moderatör) #4
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ı
Bu konu beni çok zorladı... :)

std.stdio.File ve std.stream.File arasında bir kaç kez gidip geldim ve sonunda ikisini de anlatmaya karar verdim. Bana ikincisi daha güzel geliyor ama birincisini anlatmasam, bu sefer mutlaka karışıklık yaşanacak...

Birisi sınıf olduğu için new ile oluşturmak şart!

İkisinin de kurucu fonksiyonla kurulmaları gerekiyor ama daha öyle bir şey göstermedim ki! :/

Öte yandan, programcı olacak insan aynı işi yapmak için birden fazla çözümden birisini seçmek zorunda kalabilir zaten. Bu da öyle bir şey...

Neyse, şu anda öteki derslere bağlanmamış halde şöyle:

  http://ddili.org/ders/d/dosyalar.html

Oluyor mu? Fikir! Yardım! İmdat! :)

Ali
canalpay (Moderatör) #5
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ı
Öylesine göz gezdirdim ve bana şimdiye kadar dosyalar ile ilgili gördüğüm en kolay ders en kolay kullanım olduğuna karar verdim.
Belki öncedende php'de olsun pythonda olsun bu komutları az çok gördüğüm için kolay gelmiştir ama gerçekten çok kolay geldi.

Açıkca ben anladıysam herkes anlar :-D

acehreli:
Birisi sınıf olduğu için new ile oluşturmak şart!

İkisinin de kurucu fonksiyonla kurulmaları gerekiyor ama daha öyle bir şey göstermedim ki! :/


Derslerde illaki böyle şeyler olacak. O zaman diyeceksiniz ki bunu şimdi anlamayabilirsiniz ama bunu şimdilik böyle kabul edin.
Mesela birinci ben anladım ama ikinciyi anlamadım. Neden new yok :-) Sınıf değil mi ? Değilse ne o zaman ?  Şimdilik olduğu gibi kabul ediyorum :-)

Galiba normal fonksiyon ve fonksiyonu bir değişkene atamak istiyorsunuz. Atarken başına fonksiyonun simi olan File adını getiriyorsunuz ?
acehreli (Moderatör) #6
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ı
Teşekkür Can... :) Bazı şeyleri sonra anlatmak zorunda kalacağım. :)

Evet, onlardan birisi sınıf (class) ve new ile oluşturuluyor; diğeri ise yapı (struct) ve new olmadan oluşturuluyor. D'de C++'nın aksine, sınıflarla yapılar oldukça farklı olanaklar.

Fonksiyon çağrısı gibi görünse de, aslında ikisinde de bir nesne oluşturuluyor:

File dosya = File("ogrenci_bilgisi", "w")// <- yapı nesnesi 

File dosya = new File("ogrenci_bilgisi", FileMode.OutNew); // <- sınıf nesnesi 

C++'da olsa, ikisi de aynı söz dizimini kullanırdı... :/

Ali
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
 File dosya = File ("öğrenciler.txt", "w");

Anladığım kadarıyla kurucusu bir string aldığı için herhangi bir şekilde türkçe isimli dosya kaydedemiyoruz  :huh:

this(string dosya_ismi, in char[] erişim_hakkı = "rb")

Bu şekilde bir program oluşturup çalıştırdığımda dosya içeriğini doğru ama ismini yanlış kaydediyor..
erdem (Moderatör) #8
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İkinci programda benim gibi birden fazla ismi olan kişiler için çalışmıyor. Tabi dershanede o konular daha işlenmediği için eklenmesi beklenemez. Ama siz olsanız nasıl yapardınız. Benim aklıma hemen split geliyor.

        char [] satır = dosya.readLine ();
        foreach (s; split (satır.idup, " "))
        {
            dout.writefln (s);
        }
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ı
Yanıtlanan mesaj #7
erdem:
 File dosya = File ("öğrenciler.txt", "w");

Anladığım kadarıyla kurucusu bir string aldığı için herhangi bir şekilde türkçe isimli dosya kaydedemiyoruz  :huh:

Dosya ismindeki Türkçe karakterler dosya sistemi ile ilgili bir konu. Ben D'nin dışında kaldığı için hiç bulaşmak istemedim.

Şimdi kendi ortamımda denediğimde dosyanın ismi doğru olarak "öğrenciler.txt" oldu: Linux (CentOS 5), bash, sanırım sistem utf-8 kodlamasını kullanıyor.

Ve yanlış anlaşılmasın: string ve char[] türleri de Türkçe harfler tutabilir. Sorun, bilgiyi harf harf değil, kod kod tutmasındadır. Bu yüzden "ğ"nin uzunluğu 2 çıkar.

string oluşturup kullanmakta sorun yok, sonra o string'i işlerken sorun çıkar:

char[] s = "ğ".dup;
s[0] = 'a';   // <-- Şimdi elimizde 2 uzunlukta ve BOZUK bir dizgi var 

Benim Türkçe için dchar ve wchar önermemin nedeni oydu.

Ali
acehreli (Moderatör) #10
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ı
Yanıtlanan mesaj #8
erdem:
İkinci programda benim gibi birden fazla ismi olan kişiler için çalışmıyor. ... Ama siz olsanız nasıl yapardınız.

Orada sorun, seçtiğim dosya düzeninin katı olmasında. Okuyan taraf şu düzeni beklediği için, başka türlü bir satır işi bozar:

isim soyad not1 not2

Daha güzel bir düzen, isim+değer çiftleri olabilirdi:

öğrenci:
isim: İbik
ortaisim: Tüy
soyad: Horozcu
notlar:
not: 20
not: 7
not: 40

öğrenci:
isim: Hortum
soyad: Filci
notlar:
not: 65


Böylece boş bırakılan değerlerin varsayılanları kullanılırdı. Ama bunun da bir kaç tane standardı var. Yalnızca bir örnek: XML.

Benim aklıma hemen split geliyor.

Çok işe yarar ama yine de orta ismin olup olmadığını bir çabayla bulmamız gerekirdi.

Ali
canalpay (Moderatör) #11
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ı
Sanırım file file'a değil file file file ve file'a karşı.

İlk ikisini zaten siz demiştiniz:
1) std.stdio içindeki struct File
2) std.stream içindeki class File

3)std.cstream
4)std.file
Hatta zorlarsak C'nin standart kütüphanesini bile sayabiliriz :-)
std.file bana daha yakın ve basit geldi. Struct ya da Class yapısında değilde işlevsel biçimde yazılmış. Örn:
import std.file;
void main()
{
   int[] a = [ 0, 1, 1, 2, 3, 5, 8 ];
   write("filename", a);
   int[] b = [ 13, 21 ];
   append("filename", b);
   assert(cast(int[]) read("filename") == a ~ b);
}

Hem dosya ile ilgili tüm işlevle bir modülde bulunuyor. Ben şuan std.file'ı yeğliyorum ya siz?
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ı
Ben std.file'ı klasör ve dosya işlemleri ile ilgili olarak hatırlıyordum. read ve write'tan haberim yoktu. Ya sonradan eklenmiş, ya da gözümden kaçmış.

Ama onlar çok alt düzey okuma ve yazma işlemleri gibi görünüyorlar. Önce bir dizgiye okumak ve sonra örneğin double'a dönüştürmek gerekebilir.

Hatta, write'ın void[] kullandığına bakılırsa, verileri oldukları gibi bellekteki bayt dizileri olarak yazdırıyor. O dosya sonra başka bir platformda açılırsa, bilgiler büyük veya küçük soncul (endianness) uyuşmazlığı nedeniyle bozuk okunabilir.

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, 11:26:35 (UTC -08:00)