Forum: D Programlama Dili RSS
dosyadan okuma dosyaya yazma ile ilgili bir soru/sorun
Sayfa:  1  2  3  4  sonraki 
cos00kun #1
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: dosyadan okuma dosyaya yazma ile ilgili bir soru/sorun
Merhabalar. Sorum konu başlığındaki gibi :-) Şimdi aşağıdaki kodu yazdığımda;
import std.stdio;
import std.string;
 
void main(string[] parametreler)
{
    string giriş;
    File dosya = File ("Deneme.co", "a+" );
    for(;giriş!="q";)
    {
        write("Bir String giriniz..");
        giriş=strip(readln());
 
        if (giriş!="q")
        dosya.writeln(giriş);
    }
 
    while(!dosya.eof()) {
        giriş=strip(dosya.readln());
        writeln(giriş);
    }
    readln();
}
dosyaya yazma kısmında sorun oluşmuyor ancak dosyadan okuyup ekrana basma konusunda sonuç vermiyor. Oysa;
import std.stdio;
import std.string;
 
void main(string[] parametreler)
{
    string giriş;
    File dosya = File ("Deneme.co", "a+" );
    
    for(;giriş!="q";)
    {
        write("Bir String giriniz..");
        giriş=strip(readln());
 
        if (giriş!="q")
        dosya.writeln(giriş);
    }
    dosya.close();     // Burayı ekledim...
    dosya.open("Deneme.co","r")// Burayı ekledim..
 
    while(!dosya.eof()) {
        giriş=strip(dosya.readln());
        writeln(giriş);
    }
    readln();
}
gibi değiştirip yazdığımızda sonuç verdi !! oysa kitaptan okuduğum kadarıyla "a+" belirtecinin hem okuma hemde yazmaya ayarlı şekilde dosyayı açması gerekmezmiydi ?? neden dosyadan okuma sırasında dosya kapatıp tekrar açmam gerektide sonuç elde edebildim ?

Acaba kitaptaki şu bölüm;
Bazen aynı File nesnesinin başka dosyayı veya aynı dosyayı farklı erişim haklarıyla kullanması istenir. Böyle durumlarda dosyanın kapatılıp tekrar açılması gerekir:
okuma ve yazma erişimli dosyayı açsak bile okuma ve yazma kısmını ayrı kullanırkende kullanmamızı mı öğütlüyor?
E=mc^2
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 1076 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
import std.exception;
import std.stdio;
import std.file;
 
 
void main(string[] args)
{
    try
    {
        byte[] veri = [0x6d, 0x65, 0x72, 0x68, 0x61, 0x62, 0x61];
 
        auto kütük = File("ileti.txt", "a");
 
        kütük.rawWrite(veri);
 
        auto okunan = cast(byte[]) read("ileti.txt");
 
        writeln("Okunan ", okunan);
    }
    
    catch (ErrnoException hata)
    {
        // Hataları işle
    }
}
a+ ile dosyayı güncellemek için açıyor. Tüm yazılanlar sona ekleniyor.
kerdemdemir #3
Üye Eyl 2013 tarihinden beri · 168 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sunu deneyebiilirmisin Coskun

https://dlang.org/library/std/stdio/file.rewind.html

import std.stdio;
import std.string;
 
void main(string[] parametreler)
{
    string giriş;
    File dosya = File ("Deneme.co", "a+" );
   
    for(;giriş!="q";)
    {
        write("Bir String giriniz..");
        giriş=strip(readln());
 
        if (giriş!="q")
        dosya.writeln(giriş);
    }
    dosya.flush();     // Bende Burayı ekledim...
    dosya.rewind();  //Bende Burayı ekledim..
 
    while(!dosya.eof()) {
        giriş=strip(dosya.readln());
        writeln(giriş);
    }
    readln();
}
kerdemdemir #4
Üye Eyl 2013 tarihinden beri · 168 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Cok akitf olmadigim bir toplantidaydim dayanamadim denedim

ir String giriniz..erdedem
Bir String giriniz..erdem
Bir String giriniz..erdem
Bir String giriniz..q

erdedem
erdem
erdem

Calisti sanki. Cursor dosyanin sonunda oldugu icin basa sarman gerekiyordu anladigim kadariyla.
cos00kun #5
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
Öncelikle teşekkür ederim her ikinizede.. ben zaten dosyay yazıp okuyabiliyorum burda bir problemim yok sadece "a+" nın dosyada hem okuma hem yazmaya destek vermesine rağmen her iki işlemi kullanırken neden sonuç üretemediğini öğrenmek istedim  :blush:

Bir şekilde okuma yaptıysak ondan sonra yazma yapıyorken dosyayı close() ile kapatıp tekrar open() ile yada yeniden dosya tanımlayarak açmamız gerekiyor.. Bu durumda ben neden "a+" yı kullanayımki  :rolleyes: gider önce "w" ile yazar ardından "r" ile okuturum olur biter madem ki hem okuma hem yazmayı "a+" işlemi ile aynı anda kullanamıyorsam..

Bu arada rawRead() ve rawWrite() hakkında da biraz bilgi verilirse iyi olur..
teşekkürler..
E=mc^2
cos00kun #6
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
kerdemdemir:
....Cursor dosyanin sonunda oldugu icin basa sarman gerekiyordu anladigim kadariyla.
Bu mantıklı geldi bana yani yazınca dosya sonuna gidiyor belirteç.. ama kitaptan okuduğum kadarıyla "a+" ile işlem yaparken eğer dosyaya yazılacaksa dosyanın en sonuna , dosyadan okuma yapılacaksada dosyanın en başına konumlanıyor cursor indexi diye biliyorum bu durumda yanlışım yoksa bu tezimiz çürümüş oluyor  :rolleyes: yada yanlışım var  :-)
E=mc^2
kerdemdemir #7
Üye Eyl 2013 tarihinden beri · 168 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
a+ ile actiginda her zaman sonda oluyor. Rewind cagirip basa sarmadigin surece okuma yapamaman gerekiyor.Tam basa degilde orta yerlere gitmek istiyorsan fseek kullanabilirsin. a+ benim en cok kullandigim format boylece daha once yazdigim seylerin ustune yazilmiyor. Son kaldigim noktadan dosyanin ustune ekleniveriyor.
cos00kun #8
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
kerdemdemir senin dediğini denedim ve sanırım haklısın.. a+ ile açılan dosyada imleç sonda oluyor bunu yukarıdaki programda a+ yı kullanarak direk ilk işlemi okuma yaptığımda yine aynı şekilde sonuç üretememesinden anladım .. Ben kitapta şu bölümdeki yazılanlara göre mantık yürüttüm;

burada şöyle yazıyor ( http://ddili.org/ders/d/dosyalar.html );
a+   okuma ve sonuna yazma erişimi 
dosya yoksa: boş olarak oluşturulur.. 
dosya zaten varsa: içeriği korunur; başından okunacak ve sonuna yazılacak şekilde hazırlanır.

Bende sandımki dosyadan okumaya çalıştığımızda imleci başa alıyor , yazmaya çalıştıımızda sona alıyor. (nasıl olacaksa o ) Belki aynı zamanda D dili düşük seviyeli de bir dil olmasaydı şayet belki bu dediğim olabilirdi bilemiyorum  :-p
umarım yanlış birşeyler anlamamışımdır..
saygılar sevgiler..
E=mc^2
erdem (Moderatör) #9
Üye Tem 2009 tarihinden beri · 1076 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #5
cos00kun:
Bu arada rawRead() ve rawWrite() hakkında da biraz bilgi verilirse iyi olur..

Bunlar dosyaya ikili yazıp okuyor. Örneğin örnek programın kütüğe ne yazdığına bakabilirsin.

Bir de dosyaya normal yazma ile ikili yazma arasında ne fark olduğunu anlamak için şu eski iletiye bakabilirsin. Ya da aynı veriyi hem normal hem ikili yazıp boyutlarını karşılaştırabilirsin.

http://ddili.org/forum/thread/352
 
Bu belgede D'de kütük işlemleri ile ilgili oldukça fazla bilgi var.

Working with files in the D programming language
cos00kun #10
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
evet şimdi kodumuz şu şekilde oldu (tamamını okutmuyorum çok yer kaplamasın diye)
import std.stdio;
import std.string;
import std.file;
import std.format;
 
void main(string[] parametreler)
{
    short numEntities;
    ushort id;
    ushort collisionType;
    float collisionRadius;
//.........
//..........
 
    File dosya = File ("FALCON4.ct", "rb" );
    numEntities = dosya.rawRead(new short[1])[0];
 
    for(int i=0;i<6; i++)  { // Şimdilik bu 6 dönüyor ancak program bitiminde kayut sayısı kadar dönecek..
        id = dosya.rawRead(new ushort[1])[0];
        collisionType = dosya.rawRead(new ushort[1])[0];
        collisionRadius = dosya.rawRead(new float[1])[0];
//.........
//..........
 
        writeln("Num Entities= ",numEntities);
        writeln("Id= ",id);
        writeln("Collision Type= ",collisionType);
        writeln("collision Radius= ",collisionRadius);
//.........
//..........
    }
    dosya.close();
    readln();
}
artık istediğimiz şekilde değişkenlerle oynayabiliyoruz şimdi bu aşamada ben bu işleminde
for(int i=0;i<6; i++)  { // Şimdilik bu 6 dönüyor ancak program bitiminde kayut sayısı kadar dönecek.. 
for döngüsünü dosyada numEntities kadar kayıt yaptığından o kadar döndüreceğim..
aşağıdaki değişiklikleri yapınca sıkıntı olmuyor
............
............
    short numEntities;
    numEntities = dosya.rawRead(new short[1])[0];
 
    ushort[] id;
    ushort[] collisionType;
    float[] collisionRadius;
    //.....
    //.....
 
    id.length=numEntities;
    collisionType.length=numEntities;
    collisionRadius.length=numEntities;
    //.....
    //.....
    
    for(int i=0;i<numEntities; i++)  { // Şimdilik bu 6 dönüyor ancak program bitiminde kayıt sayısı kadar dönecek..
        id[i] = dosya.rawRead(new ushort[1])[0];
        collisionType[i] = dosya.rawRead(new ushort[1])[0];
        collisionRadius[i] = dosya.rawRead(new float[1])[0];
        //.....
        //.....
 
        writeln("Num Entities= ",numEntities);
        writeln("Id= ",id[i]);
        writeln("Collision Type= ",collisionType[i]);
        writeln("collision Radius= ",collisionRadius[i]);
        //.....
        //.....
 
}
    dosya.close();
    readln();
}

ancak şöyle birşey denediğimde de aslında burda ki işlemin aynısını yapıyor gibi görünsede işlemde hata alıyorum
......
......
 ushort[numEntities] id;
    ushort[numEntities] collisionType;
    float[numEntities] collisionRadius;
    //.....
    //..... 
acaba Dizilerde [] parantezleinin içine bir değişken i atamıyormuyduk ? yoksa yoğun bir günün ardından kafam yine karıştıda basit hatta çok basit birşşeyimi atlıyorum  :rolleyes:
E=mc^2
Bu mesaj cos00kun tarafından değiştirildi; zaman: 2018-01-20, 05:28.
erdem (Moderatör) #11
Üye Tem 2009 tarihinden beri · 1076 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bence böyle tek tek dizi kullanmak yerine yapı kullanmak daha mantıklı.

Ayrıca okumaya çalıştığın ct uzantılı dosyanın bir örneği, bunu kullanan bir program örneği var mı. Hatta bu sınıfın yapının özelliklerini gösteren bir belge vardı sanırım.
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4644 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Tek değişken okurken aşağıdaki koddaki gibi new kullanmaya gerek yok.
    numEntities = dosya.rawRead(new short[1])[0];
Yukarıdaki kod new ile gereksizce yer ayırıyor. (rawRead örneğinde öyle yaptıklarını biliyorum.) Onun yerine zaten var olan numEntities'i tek elemanlı dizi gibi kullanıp üzerine de okuyabilirsin ve dönüş değerini de tekrar atamana gerek yok:
    dosya.rawRead((&numEntities)[0..1]);
Evet onun yazımı da çok karışık. Bence tek nesne çok daha basit okunabilmeliydi.

Dizilerde [] parantezleinin içine bir değişken i atamıyormuyduk

D'de dizi uzunluğu verildiğinde sabit uzunluklu dizi oluyor ve o uzunluk dizinin türünün bir parçası oluyor. O yüzden hayır, değişken kullanılamaz. (Derleme zamanında bilinmesi gerek.)

Ali
cos00kun #13
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Erdem hocam öncelikle mailini göremediğim için dosyayı wetransfere attım eğer özelden maili gönderirsen orayada yollayabilirim.  link şu;
https://we.tl/v7QTzDgGcN

bunun açıklayaıcı bilgileride şurada;
https://pmc.editing.wiki/doku.php?id=falcon4:file_formats:…

Bu arada her ikinizin söylediklerinin doğru olduğunu biliyorum. Ancak kendimce şöyle bir şey düşündüm.. Öncelikle bildiğim öğrendiklerim ve kapasitem ölçüsünde kötüde olsa bir kod yaz.. Sonra bu kodu iyileştir.. Daha sonra tüm söylenilenlerle beraber kodu iyice iyileştir ve gerekiyorsa o yöntemlere göre yenile... Sonra kodun iskeletini tamamla.. Sonrada Gtkd İle bütünleştir.

Genelde sorunlarıma gelen cevaplar daha ileri seviye kodları içerdiğinden ben böyle bir yol buldumki hem çok sıkılmadan hemde biraz gaza gelerek ilerleyeyim  :-) (Aman yanlış anlaşılmasın hocalarım gelen cevaplar gerçekten tamda nokta atışı cevapları oluyor burda sorunun kaynağı siz değil benim D deki seviyem oluyor)
Bu hafta yoğundu çoluk çocuk vesaire artık haftaiçi kodu geliştireceğim  :blush:
teşekkürler..

Edit: Verdiğim dosyanın açıklayıcı linkinde ordaki değişkenlerin sonuna 2 adet birer bytlık değişken daha eklenmelidir yoksa dosyadan okunan bilgiler yanlış okuncaktır.. Bunu şöyle düşünün bu dosya zaman içerisinde güncellenmiş ve 1 bytlık 2 tane ayrı değişken bu bahsedilen yapıya eklenmiştir ancak site eski olduğundan orda bu yeni değişkenler belirtelmemiştir !!
E=mc^2
Bu mesaj cos00kun tarafından değiştirildi; zaman: 2018-01-21, 09:44.
cos00kun #14
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
https://www.youtube.com/watch?v=IJtm7UX5yYQ&t=122s
burdaki videonun 8.18 ~ 8.23 bu aradaki 5 saniyede aslında benim yukarıda linkini verdiğim dosyayı okuyor ve videodaki düzende ekrana getiriyor ardından video başka konulara geçiyor ancak devamından bahsedersem işte bu akranda bastığım herhangi bir değeri değiştirdikten sonra save tuşuna basınca tüm bu dosyayı güncellemeli yapacağım program..
Not: Videoda gösterilen değerler aslında bizim dosyadaki değişkenler ancak videoda görülen program onları okunaklı hale getiriyor örneğin bizim programda dosyadan okunan değişken ushort id; videoda No diye sutunlandırılmış v.s..
E=mc^2
cos00kun #15
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
FALCON4.ct dosyasını herhangi bir yere üye olmak istemeyenler için GitHubada yükledim burdan indirilebilinir  :-p
https://github.com/co00kun/Falcon4
E=mc^2
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  3  4  sonraki 
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: 2018-02-24, 10:04:40 (UTC -08:00)