+ Cevap Yaz
Toplam 2 sayfadan 2. sayfa
İlkİlk 1 2
19 sonuçtan 11 ile 19 arası gösteriliyor

Konu: Dosyaya yazım konusunda yardım lütfen..

  1. #11
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,893

    Öncelikle, program kodunu ek olarak vermek yerine açıkça konu içine yazmanı öneririm. Şimdi yazdıklarımın ne ile ilgili oldukları ilk bakışta anlaşılamayacak:

    - Program akışının goto'lar yerine if, while, for, vs. gibi C kontrol yapıları ile yapmanı öneririm. goto'lu kod içinden çıkılmaz bir hal alır. (Herhalde öyledir... Ben hiç yapmadım... Bu o kadar caydırılan bir uygulamadır ki, en başından bilinir ve hiç yapılmaz...)

    - 'void main' yazmış olman bende kullandığın kaynakların güvenilirliği konusunda şüphe uyandırıyor. Doğrusu 'int main'dir. 'void main' yazan öğretmenlerini düzeltmek gerek...

    - Global değişkenler ancak gerçekten gerekirse kullanılır; sen herhalde işlev parametrelerini bilmediğin için global değişken kullanıyorsun.

    - <conio.h> başlığı bende yok; onun yerine standart olan getchar() kullanılabilir mi acaba?

    - Her program kendi işini yapmalı. Başlatıldığı ortamdaki karakterleri yok etmek (ekranı silmek) bu programın işi olmamalı

    - Şu satırda parametreler arasında virgül eksik:

    fprintf(dosya,"%s" satir);

    Ali

  2. #12
    İptal Durumu
    Üyelik Tarihi
    07/2009
    Mesaj
    168

    Alıntı acehreli, mesajından alıntı: Mesajı Gör
    cmpstr'ı ben de bilmiyorum. Belki kozmotr zaten yazarken yanlış yazmıştır ama onun yerine strcmp'u kullanabilirsin. <string.h> başlığını eklemen gerekir.

    Ali

    dalgınlık arkadaş beni düzeltmiş teşekkür ederim.

    string.h kutuphanesindeki strcmp'i kast etmiştim.

  3. #13
    Üye ipsiz53 Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    03/2009
    Mesaj
    16

    Kod:
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <conio.h>
    char *s;
    FILE *dosya;
    char secim;
    kayit();
    int main()
    {
    system ("cls");
    printf ("\n                    ----------------------------------");
    printf ("\n                   |          KAYIT PROGRAMI          |");
    printf ("\n                   |        ELEKTRiK-ELEKTRONiK       |");
    printf ("\n                   |           MUHENDiSLiGi           |");
    printf ("\n                    ----------------------------------");
    printf ("\n                   |          SUBAT - 2010            |");
    printf ("\n                    ----------------------------------");
    printf ("\n\n\n\n                                 **********");
    printf ("\n                                 * DENEME *");
    printf ("\n                                 **********");
    printf ("\n\n\n\n\n                                             Cemal");
    printf ("\n                                            ");
    printf ("\n                                          ");
    printf ("\n\n\n                      ____Herhangi Bir Tusa Basiniz___");
    secim=getch();
    system("cls");
    printf("____Ne yapmak istiyorsunuz ____\n\n");printf("1_| Kayit \n2_| Okuma\n3_| CIKIS\n");
    scanf("%d",&secim);
    if(secim==1){
    printf("Simdi kaydetmek istediklerinizi girebilirsiniz\n\n");
    kayit();
     
    }
    }
     
    kayit()
    {
    dosya=fopen("kayit.txt","w+");if(dosya==NULL)exit(1);
    gets(s);
    fprintf(dosya,"%s",s);
    getch();
    fclose(dosya);
    }
    

    Buradaki hatm nedir?? 1 i seçince hata veriyo.compile edince hat gstermiyor..

  4. #14
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,893

    Bende de hatasız derleniyor ama uyarılar (warning) var!

    main'den önce şöyle bir satır var:

    Kod:
    kayit();
    
    Global alanda işlev çağrılamaz. Sen de herhalde onu bildirim (declaration) olarak düşündün. Eğer öyleyse, dönüş türünü ve parametrelerini de yazmak gerekir. Eğer yoksa, 'void'...

    Şimdi baktım, kayit()'ı tanımladığın yerde de dönüş türünü ve parametrelerini belirtmemişsin. (Çok eski bir kaynaktan çalışmıyorsun değil mi? Çok eskiden C'de bunlara izin veriliyordu.)

    Kod:
    void kayit(); // bildirim (declaration)
    
    // ...
    
    void kayit()
    {
        // ... tanım (definition) ...
    }
    
    Şurada düzen karakterinde bir hata var:

    Kod:
        scanf("%d",&secim);
    
    secim bir karakter olduğu için, "%c" yazman gerekir. Veya, "%d" kullanacaksan, secim'in int olması gerekir.

    Derleyicim (gcc) beni uyarıyor: gets tehlikelidir, kullanılmamalıdır. Onun yerine fgets'i kullanabilirsin:

    Kod:
        fgets(s, /* s'de ne kadar yer varsa; o buraya yazilir */, stdin);
    
    Ve en büyük sorun görünüyor: s'nin bir 'char*' olduğunu yazmışsın. Yani bir 'char' göstergesi... Hangi char'ı gösteriyor?

    Tabii normalde aslında bir dizginin ilk karakterini gösterir ama o zaman soru şöyle sorulur: hangi dizgiyi gösteriyor?

    Gerçekten... O soruyu kendine sormalısın. Girişten aldığın karakterleri s'nin gösterdiği yere yazmak istiyorsun. s nereyi gösteriyor? Girişten gelen karakterler nereye yazılabilirler?

    C'de girişken dizgi okumak zor bir iş olduğu için, çoğunlukla yeterince büyük olduğu düşünülen bir dizgi kullanılır:

    [code]char s[1000]; // umariz yeterlidir

    // ...

    fgets(s, sizeof(s), stdin);[/codeBende de hatasız derleniyor ama uyarılar (warning) var!

    main'den önce şöyle bir satır var:

    Kod:
    kayit();
    
    Global alanda işlev çağrılamaz. Sen de herhalde onu bildirim (declaration) olarak düşündün. Eğer öyleyse, dönüş türünü ve parametrelerini de yazmak gerekir. Eğer yoksa, 'void'...

    Şimdi baktım, kayit()'ı tanımladığın yerde de dönüş türünü ve parametrelerini belirtmemişsin. (Çok eski bir kaynaktan çalışmıyorsun değil mi? Çok eskiden C'de bunlara izin veriliyordu.)

    Kod:
    void kayit(); // bildirim (declaration)
    
    // ...
    
    void kayit()
    {
        // ... tanım (definition) ...
    }
    
    Şurada düzen karakterinde bir hata var:

    Kod:
        scanf("%d",&secim);
    
    secim bir karakter olduğu için, "%c" yazman gerekir. Veya, "%d" kullanacaksan, secim'in int olması gerekir.

    Derleyicim (gcc) beni uyarıyor: gets tehlikelidir, kullanılmamalıdır. Onun yerine fgets'i kullanabilirsin:

    Kod:
        fgets(s, /* s'de ne kadar yer varsa; o buraya yazilir */, stdin);
    
    Ve en büyük sorun görünüyor: s'nin bir 'char*' olduğunu yazmışsın. Yani bir 'char' göstergesi... Hangi char'ı gösteriyor?

    Tabii normalde aslında bir dizginin ilk karakterini gösterir ama o zaman soru şöyle sorulur: hangi dizgiyi gösteriyor?

    Gerçekten... O soruyu kendine sormalısın. Girişten aldığın karakterleri s'nin gösterdiği yere yazmak istiyorsun. s nereyi gösteriyor? Girişten gelen karakterler nereye yazılabilirler?

    C'de girişken dizgi okumak zor bir iş olduğu için, çoğunlukla yeterince büyük olduğu düşünülen bir dizgi kullanılır:

    Kod:
    char s[1000];  // umariz yeterlidir
    
    // ...
    
        fgets(s, sizeof(s), stdin);
    
    Ali

  5. #15
    Üye ipsiz53 Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    03/2009
    Mesaj
    16

    char s[1000]; yaptım
    main() den önce int kayit(); diye tanımladım..dediklerinizi yaptım.program çalışıyor.1 i seçtiğimde çıkıyor.kayit kısmında bi hata yapıyorm heralde.
    "kaydetmek istediklerinizi giriniz " mesajından sonra kapanıyor.sanki getch(); devreye giriyor bir tek..
    ** bir sorum olucak bu noktada(aslında günlerdir soruyorm)
    fgets() komutu yazdıklarımın sonunda basacağm ilk enter a kadarını mı char s[1000] e
    aktarıyor ?mesela şiir yazamaz mıyım..her satır onu için enter layarak ?
    **okutma da satır satır mı olacak peki dosyadan ?onun için de bir while döngüsüne mi sokmalıyım en son karakter NULL gördüğünde duracak(durana kadar da ekrana yazacak) ??

    öğrenecem inşallah sayenizde

    bu arada borland5 kullanıyorm.çalıştığım kaynakta hocamdan aldığım e-book.. eski bişeye benziyo.bide internetten araştırıyorm.. saygılar

    Kod:
     
    //
    ..........................
    .......................
     
    if(secim==1){
    printf("Simdi kaydetmek istediklerinizi girebilirsiniz\n\n");
    kayit();
    }
     
    }
     
    int kayit()
    {
    dosya=fopen("kayit.txt","w+");if(dosya==NULL)exit(1);
    fgets(s,1000,stdin);
    fprintf(dosya,"%s",s);
    getch();
    fclose(dosya);
    }
    

  6. #16
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,893

    Alıntı ipsiz53, mesajından alıntı: Mesajı Gör
    int kayit(); diye tanımladım
    O işlev bir 'int' döndürmüyor. Hiçbir değer döndürmediği için dönüş türü yerine 'void' yazılması gerekir:

    Kod:
    void kayit();
    
    1 i seçtiğimde çıkıyor
    Sen herhalde '1' karakterini denetlemek istiyorsun. Tamsayı değeri olan 1'i değil. Aralarındaki farkı biliyor musun? Karakteri denetlemek için (okunaklı olsun diye boşluklar da kullanarak...):

    Kod:
        if(secim == '1') {
    

    fgets() komutu yazdıklarımın sonunda basacağm ilk enter a kadarını mı char s[1000] e
    aktarıyor
    Evet.

    Genel olarak, bütün standart işlevlerin internette belgeleri olduğunu biliyor musun? Bence kullanmadan önce hızlıca da olsa bir gözatman çok yararlı olur. İngilizceleri için Google'da "man fgets" gibi aratmak yetiyor.

    Bu konuda Türkçe kaynak bilen var mı?

    **okutma da satır satır mı olacak peki dosyadan ?onun için de bir while döngüsüne mi sokmalıyım
    Evet.

    en son karakter NULL gördüğünde duracak(durana kadar da ekrana yazacak) ??
    Okuduğun dosyalar (stdin dahil) "akımdırlar. Akımların sonunda NULL olmaz, "akım sonuna gelinir". (Dizgilerin sonunda NULL olur.)

    Daha geçende feof işlevini kullanan bir örnek geçmişti. Akımın sonuna gelindiği feof ile denetlenir.

    öğrenecem inşallah sayenizde
    Tabii ki... Ama ben kendi adıma, iyi bir kitaptan ilerlemeyi çok daha verimli buluyorum. Hiçbir konuyu atlamadan öğrenerek...

    Ali

  7. #17
    Üye ipsiz53 Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    03/2009
    Mesaj
    16

    biri seçmek derken yanlış belirtmişim.1 e basım enterlıyorum.yani karakter okutmadım (int)..kayit() fonksiyonunda fgets kullanımındaki hatamı göremedim..
    bu arada deneme yanilma şöyle bir okuma kodu yazdım.


    Kod:
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    FILE *dosya;
    char s[100000];
    int i;
    int main()
    {
    dosya=fopen("denedik.txt","r");
    while(fscanf(dosya,"%s\n",s)!=EOF)printf("%s",s);
    getch();
    fclose(dosya);
    }
    
    ** okumada kelimeleri bitisik okuyor.printf de "%s" araya bir bosluk( ' ' ) koydum bu sefer normal okudu.sakıncası olurmu algoritma açısından ?



    PHP Kodu:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    char s[100000];
    FILE *dosya;
    char secim;
    void kayit();
    int oku();
    //char *fgets();
    int main()
    {
    system ("cls");
    printf ("\n                    ----------------------------------");
    printf ("\n                   |          KAYIT PROGRAMI          |");
    printf ("\n                   |        ELEKTRiK-ELEKTRONiK       |");
    printf ("\n                   |           MUHENDiSLiGi           |");
    printf ("\n                    ----------------------------------");
    printf ("\n                   |          SUBAT - 2010            |");
    printf ("\n                    ----------------------------------");
    printf ("\n\n\n\n                                 **********");
    printf ("\n                                 * DENEME *");
    printf ("\n                                 **********");
    printf ("\n\n\n\n\n                                             Cemal");
    printf ("\n                                            ");
    printf ("\n                                          ");
    printf ("\n\n\n                      ____Herhangi Bir Tusa Basiniz___");
    secim=getch();
    system("cls");
    printf("____Ne yapmak istiyorsunuz ____\n\n");printf("1_| Kayit \n2_| Okuma\n3_| CIKIS\n");
    scanf("%d",&secim);
    if(
    secim==1){
    printf("Simdi kaydetmek istediklerinizi girebilirsiniz\n\n");
    kayit();
    }
    if(
    secim==2){
    printf("*****************\n ");
    oku();
     
    }
     
     
    }
    void kayit()
    {
    int i;
    dosya=fopen("denedik.txt","w");
    printf("Ne yazmak istiyorsan gir > ");
    for(
    i=0;i<5;i++){
    gets(s);
    fprintf(dosya,"%s\n",s);}
    getch();
    fclose(dosya);
    }
     
    int oku()
    {
    dosya=fopen("denedik.txt","r");
    while(
    fscanf(dosya,"%s",s)!=EOF){
    printf("%s ",s);}
    getch();
    fclose(dosya);



    en son hali programin..kayit da yapıyor okuma da..ancak fgets kullanamadim.
    kayit(); fonksiyonunda okuyacağı satır 5 belli.ben böyle olsun istemiyorum..istedğim bir an kayıt fonksiyonundan çıkmak ve dosyaya kaydettirmek istiyordum...

  8. #18
    Ali Çehreli
    Üyelik Tarihi
    10/2002
    Mesaj
    2,893

    1) scanf ile okurken; "%d" int içindir. Ama 'secim' bir char. Lütfen onların uymalarını sağla. Örneğin 'secim'i int olarak tanımla.

    2a) kozmotr'un "exit" ve mystr diye İngilizce olarak ve dalgınlıkla cmpstr diye yaptığı yardımı düzeltiyorum. Girişten "cik" geldiğinde okumayı durdurmak için şöyle yapabilirsin:

    Kod:
    if (strcmp("cik", s) == 0) {
        // giristen "cik" geldi; okumayi durdurabiliriz
    }
    
    (Not: Kaynak kodda Unicode'u desteklemediği için bu konuda ilkel kalmış olan C++'ta taşınabilir şekilde "çık" yazılamaz. Onun yerine civciv sesi olan "cik"i kullanıyorum.)

    Artık 5 gibi bir sabit yerine, girişten "cik" gelene kadar okuyabilirsin.

    (C++'nın İngiliz alfabesini kullanmayan insanlara layık gördüğü gibi, istersen İngiliz alfabesindeki harflerle kısıtlı kalarak "son" filan gibi bir dizgi de kullanabilirsin.)

    2b) Ama bu işin doğrusu, feof işlevini kullanmaktır. Bence ya kozmotr'un önerisini uygula, ya da feof'u kullan.

    3) oku() işlevini sanki bir değer döndürüyormuş gibi 'int oku()' diye bildirmiş ve tanımlamışsın. Bir değer döndürmediği için 'void oku()' olması gerekiyor.

    4) scanf ve arkadaşları, "%s" okurken boşlukları okumazlar. printf'te boşluk kullanmak bu gerçeği değiştirmez. Girişte iki boşluk olsa, printf'le sen hep bir veriyor olursun. denedik.txt dosyasında aralarda iki boşluk kullan; fscanf hepsini birden tek ayraç olarak kabul eder ve onları okumaz.

    5) "fgets kullanamadim" ile ne kasdettiğin anlaşılmıyor. Nasıl kullandın? Derlenmiyor mu? Beklediğin gibi çalışmıyor mu?

    Ali

  9. #19
    c3r
    c3r hatta değil
    Usta olmak istiyorum c3r Adlı Üyenin Profil Grafiği
    Üyelik Tarihi
    11/2008
    Yer
    Monitörün karşısı
    Mesaj
    840

    bu da benden olsun,anlatımı hoşuma gitmişti
    http://www.cplusplus.com/doc/tutorial/files/

+ Cevap Yaz

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

     

Bookmarks

Mesaj Yazma Hakları

  • Yeni mesajgöndermezsiniz
  • Cevap yazamazsınız
  • Dosya ekleyemezsiniz
  • Mesajınızı düzenleyemezsiniz