C++ Dizin Oluşturma, İçerik Elde Etme Gibi Sistem Bağımlı İşemler

Başlatan sem, 04 Nisan 2011 - 11:14:38

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

sem

Arkadaşlar C++ için aradım fakat bulamadım bu gibi işlemler için sınıflar. Örneğin bir dosya ya da diznin varlığını kontrol eden access fonksiyonu... C ile bir dosya/dizin varlığı bu fonksiyon ile elde ediliyor. Tabii bunlar standart C'de yok... Örneğin Windows için aynı işlemi _access ile yapmak zorunda kalıyoruz...

Ya da dizin içeriği elde etme işlemleri; scandir, readdir, opendir gibi fonksiyonlar artık tamamı ile sistem bağımlı hale geliyor C içerisinde.

Bir başka örnek pararlel süreç oluşturma olarak verilebilir. Thread, fork kavramları da standartlarda yok... Hangi sistemde C kodlanıyorsa o sistemin fonksiyonlarına göz atmat ve sunduğu API leri öğrenmek gerekiyor...

Bu gibi işlemler için C++'da standart sınıflar var mı? Örneğin C# üzerinde doğrudan Directory diye sınıf var IO isim alanı altında... Bu C# için standar fakat C# zaten sisteme yönelik olduğu için standart olması normal... Merak ettiğim C++ için de bu gibi işlemleri yapan sınıflar mevcut da ben mi bulamadım...

Örneğin bir dosya dizin varlığını ne şekilde kontrol edeceğiz? Eğer access ile elde edeceksek geri döndürülen hata ve onu yakalama kısmı C++ için biraz basit kalıyor gibi geliyor. Ya da yeni bir dizin aynı C'deki gibi sys/stat altındaki mkdir ile mi oluşturulluyor... Yoksa hata dönüşlerine göre bu tarz işlemler için sınıflar var mı?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem

Hayır benim bildiğim kadarıyla C++'nin standart kütüphaneleri ile bu yapılamıyor. Bunun yerine ek kütüphaneler kullanmak gerekiyor. Örneğin girişe çıkışa yazma okuma diyoruz. C++ için bu herhangi bir aygıt olabilir.

Dosya işlemleri için boost'un filesystem, iş parçaçıkları için boost thread kütüphanesini kullanabilirsin.

boost::thread example

boost::filesystem example

Ben hata yakalama konusunda C++'nin daha iyi olduğunu tahmin ediyorum. Orada try cath bloğu kullanan bir örnek var ona bakabilirsin.

Hatta burada diyebilirim ki C++ her zaman C'den aykırı durumların işlenmesinde C++'den daha güvenlidir. Buna exception safety deniyor sanırım. Kısacası C++ kaynakları her zaman  daha güvenli yönetiyor diyebiliriz.

http://acehreli.org/turkcecpp/exception_safety.pdf
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

sem

Evet hata yakalama ve kaynak kullanımı konusunda size katılıyorum. Zaten C++ daha iyi bir C olduğu için mutkala stack/heap alanlarına dikkat edilmiştir.



Örneğin bir char * için yer ayırma (calloc/malloc),  dosya/dizin varlığı (access), dizin oluşturma (mkdir) gibi işlemlerin hepsinde C kütüphanelerini kullanıyorum... Hani ne kadar sağlıklı bu yaptığım iş bilmiyorum.

Bunların arasından belki yer ayırma işlemi için new kullanılabilir ama o da daha çok sınıf göstericileri için kullanılıyor sanırım. Örneğin calloc, malloc C için dahi standart fakat C++ için aynı işlevin dengini bulamadım.

O nedenle malloc.h kullanmak zorunda kalıyorum şimdilik. Araştırmalarım devam ediyor =)
Tam olarak demek istediğim bu gibi işlemler.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem

Dosya dizin işlemleri için C kütüphaneleri kullanmanın çok fazla sorun olacağını zannetmiyorum.

Ama bellek işlemleri için kesinlikle C++'nin yöntemlerini kullanmayı tavsiye ederim. Bunlardan bir tanesi RAII (resource acquisition is initialization) yöntemi. Bu yönteme göre hiç bir kaynak (örneğin bellek) program içinde açıkça geri verilmez. Bunun yerine kaynakları yöneten bir sınıfın bozucu işlevinde geri verilir. Böylece bellek sızıntısı gibi durumların önüne geçilmiş olur.

C++ bunun gerçekleşmesini akıllı göstergeler (smart pointers) ve Boost'un akıllı göstergelerini kullanarak yapar.

http://acehreli.org/turkcecpp/akilli_gostergeler.html

http://acehreli.org/turkcecpp/boost_akilli_gostergeleri.html

Yukarıdaki ilk bağlantının başında C'deki bellek yönteminin nasıl olduğu ve hata yapmaya açık tarafları anlatılıyor. Daha sonra C++'nin akıllı göstergelerini anlatıyor.

Bir de o yazıdan ufak bir alıntı yapmak istiyorum:
Alıntı Yap
Hatta, eğer C++'ı C gibi kullanırsak, en azından kaynak sızıntıları açısından daha da kötü bir durumdayızdır. Bunun nedeni, C++'ın aykırı durum düzeneğidir (exception handling mechanism).

Ben de C++ kodu yazıyorsak bellek yönetimi için C++ 'nin yöntemlerini kullanmayı tavsiye ederim.

Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

sem

Bellek yönetimi için malloc/free nin yanında altenatifimiz varsa öğrenmek isterim. Teşekkürler bağlantılar için.

Fakat anladığım kadarı ile dizin oluşturma, access gibi işlemlerde C'ye talim =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem

Aslında o yazı tamamen malloc'a alternatif C++ yöntemlerini anlatıyor. Biraz uzun olduğunun farkındayım  ;)

Basitçe bellek ayırma işlemini bir sınıfa devrediyoruz. Belleği geri verme işlemi ise sınıfın bozucu işlevinde (deconstructor)  delete p_; gibi yapıldığı için ortada bellek yönetiminden kaynaklanacak sorun kalmamış oluyor.

Kişisel olarak ben dosya dizin işlemleri için de kesinlikle Boost'un Filesystem kütüphanesini tercih ederdim.

Kullanımı da oldukça kolay gibi gözüküyor:

#include <iostream>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;

int main(int argc, char* argv[])
{
  if (argc < 2)
  {
    std::cout << "Usage: tut1 path\n";
    return 1;
  }
  std::cout << argv[1] << " " << file_size(argv[1]) << '\n';
  return 0;
}


Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

sem

Evet, ben 350 sayfayı iki günde okuyunca aklıma çok girmemiş... calloc/malloc yerine new kullanmak daha kullanışlı aynı şekilde free yerine delete işlecine alışınca sınıflar da aynı şekilde kullanabiliyoruz. Sanırım C fonksiyonlarının C++ karşılık diye yeni bir başlık açacağım.

O başlık altında soru cevap şeklinde her şeyi toparlayarak düzenli bir ilk ileti elde etmiş oluruz ve iyi bir referans olur, dönüp bakmak için;

malloc, calloc (dinamik bellek ayırma)  = new
free  = delete

ilk ileti bu şekilde her şeyi içerir. C'den C++ a geçiş yapacak arkadaşlar için güzel bir kaynak olur...


Bu başlığa konu olan dizin işlemleri gibi işlemler için standart olup olmamasının cevabı sanırım hayır. Birisi teyit ederse ÇÖZÜLDÜ olarak işaretleyeceğim.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

Erdem

Ek olarak dinamik bellek yönetimi için eğer yalın gösterge kullanıyorsak kaynakları kurucuda ayıran ve bozucuda geri veren sınıflar kullanmalıyız.

Ya da akıllı göstergeleri tercih edebiliriz. Burada konuştuklarımız dışında Standart Şablon Kütüphanesi (STL) de bir akıllı gösterge sınıfı tanımlıyormuş.

Ben C++ için dosya ve dizin okuma işlemlerinin standart dil olanakları ile yapılabildiğini bilmiyorum.

Dediğim gibi C++ konusunda kendimi hala eksik görüyorum  ;)

Uzun süredir C++ ile ilgili forumları, haber gruplarını vs.. takip etmiyorum, öğrenmeyi de 1.5 sene önce bıraktım. O yüzden yazdığım kodlarda veya anlatmaya çalıştığım konularda hata ve eksiklikler olabilir.
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

sem

Dosya okuma yapılabiliyor da dizin okumayı ben de göremedim/bulamadım maalesef.

new işlecini sınıf değil standart türler için de kullanabildiğimizi hatırlatmış olalım arkadaşlara...

Bir buçuk sene için iyi hatırlıyorsunuz o zaman =) Ben daha 3 4 gündür bakınıyorum... C bilmenin avantajından yararlanıyorum tabii biraz...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?