Yazan : Şadi Evren ŞEKER

Bu yazının amacı C dilinde dosya işlemlerinin nasıl yapıldığını anlatmaktır. C dilindeki dosya işlemlerinden önce bu dilde yazılan programın çalışacağı işletim sisteminin dosya yapısının iyi bilinmesi gerekmektedir. Bu yazının konusu dışında olan işletim sistemlerinin kullandığı dosya sistemlerini lütfen okuyunuz.

C dilinde dosya işlemleri için file.h dosyasının içerilmesi (include) gerekir.

#include <file.h>

Yukarıda gösterildiği şekilde içerilir.

Dosya Açma

Dosya açmak için fopen fonksiyonu kullanılır. Basitçe dosyanın adını ve açma şeklini alan bu fonksiyon geri değer olarak integer döndürür ve açmanın başarılı olup olmadığı anlaşılabilir.

if(fopen(“deneme.txt”,”r”)){

printf(“dosya açıldı”);

}else{

printf(“dosya açılamadı”);

}

yukarıdaki örnek kodda fopen fonksiyonuna parametre olarak “deneme.txt” dosyası verilmiştir. Bunun anlamı programımız ile aynı dizinde bulunan deneme.txt dosyasının açılmasıdır. Şayet farklı bir dizinden okunması isteniyorsa tam yol verilebilir. Örneğin:

c:denemedeneme.txt –> C sürücüsundeki deneme dizinin altındaki deneme.txt (WINDOWS)

/usr/bin/deneme.txt –> root dizin / altındaki usr altındaki bin altındaki deneme.txt dosyası (LINUX)

..dosyalardeneme.txt –> programımızın bulunduğu dizinin bir altında bulunan dosyalar dizinin altındaki deneme.txt dosyası (WINDOWS)

şeklinde kullanılabilir. Hemen ardından fopen fonksiyonuna verilen ikinci parametre ise dosyanın açılma şeklini belirtir. Bu şekiller:

r or rb
Dosyayı okuma (read) için açar.
w or wb
Dosyayı yazma(write) için açar ve şayet dosya zaten varsa içindekileri temizleyerek yoksa yeni bir dosya oluşturur.
a or ab
Dosyaya ilave (Append) için açar. Bunun anlamaı dosya yoksa oluşturulacak varsa mevcut bilgilerin sonuna yazılacak demektir.
r+ or rb+ or r+b
Mevcut Dosyayı hem okumak hemde yazmak için açar.
w+ or wb+ or w+b
Dosyayı bir önceki şekilde olduğu gibi hem okumak hem de yazmak için açar. Ancak dosya yoksa oluşturur, dosya varsa içindekileri siler.
a+ or ab+ or a+b
Dosyayı ilave şeklinde açar ve şayet dosya yoksa oluşturur, varsa içindekilerin sonuna ilave eder. Bu şekilde açılan dosyalardan hem okuma hemde yazma işlemi yapılabilir.

Yukarıdaki şekillerin “b” sembolü alanları binary mod anlamındadır.

Yukarıdaki bu şekillerden birisi tercih edilerek ilgili sembol fopen’a ikinci parametre olarak verilir. Yukarıdaki örnek kodda da görüldüğü üzere fopen fonksiyonu bir if içerisindedir. Bunun anlamı fopen fonksiyonundan başarılı sonuç dönerse dosyanın açıldığı anlaşılacaktır. Aksi halde dosyanın açılması başarısızlıkla sonuçlanmıştır ve programımızda bu durum için basit bir hata mesajı ekrana basılır.

Dosyadan okuma ve yazma

Dosya açıldıktan sonra dosyaya okuma ve yazma işlemleri yapılabilir. Okuma ve yazma işlemlerinin yapılabilmesi için yukarıda anlatılan dosya açma işlemine ilave olarakaçılan dosyayı gösteren bir göstericiye (pointer) ihtiyaç duyulmaktadır. Bu gösterici fopen fonksiyonu tarafından döndürülmektedir. Kod örneği aşağıdadır:

FILE *fp;

fp = fopen(“dosya.txt”,”r”);

yukarıdaki örnek kodun ilk satırında fp isminde bir dosya göstericisi tanımlanmıştır. İkinci satırında ise bu göstericinin içerisine fopen fonksiyonundan dönen değer atanmıştır. Buna göre dosyaya erişilmesi istendiğinde fp göstericisi üzerinden işlem yapılması yeterlidir.

Dosyalardan okuma ve yazma yapan çok sayıda fonksiyon olmasına karşılık anlaşılması en kolay fonksiyonlar C dili ilk öğrenilirken öğrenilen scanf ve printf fonksiyonlarının birer türevi olan fscanf ve fprintf fonksiyonlarıdır. Birer örnek aşağıda verilmiştir:

int i;

fscanf(fp,”%d”,&i);

fprintf(fp,”%d”,i);

yukarıdaki örneklerde bir i değişkeni integer tipinde tanımlanmıştır. Bu değişkene ikinci satırda fscanf fonksiyonu ile bir değer dosyadan okunmuştur. Bu fonksiyon ilk bakışta da anlaşılacağı üzere scanf fonksiyonundan farklı olarak ilave bir dosya göstericisi parametresi kullanmaktadır. Bu parametre fonksiyonun ilk parametresidir. Yukarıdaki örnekte bulunan “fp” dosya göstericisi de böyle bir dosya gösterici örneğidir.

fprintf fonksiyonu da ilave bir dosya göstericisi almak dışında standart printf fonksiyonundan farklı değildir.

Hatırlanması gereken önemli bir nokta, fscanf fonksiyonunun kullanılması için dosyanın okuma, fprintf fonksiyonunun kullanılabilmesi için ise dosyanın yazma şeklinde açılması gerekmektedir.

Örnek

Örnek olarak basit bir öğrenci kayıt sistemini C dilinde kodlamaya çalışalım. Amacımız “kayit.txt” isimli bir dosyaya, kullanıcıdan öğrenci bilgisi okuyup kaydetmek ve daha sonra kullanıcının istediği bir anda bu dosyayı aratarak kayıtlara ulaşmasını sağlamak olsun.

Öncelikle kullanıcı ile iletişimi sağlayan ufak bir menü tasarımı yapalım:

Yukarıdaki kodda, sonsuz bir döngü (14. satır) içerisinde dönen printf satırları ile yazılmış olan bir menü görülmektedir. Kullanıcının menüden yaptığı seçim bir değişkene okunmakta ve değerine göre if koşulları ile kontrol edilerek ilgili işlem icra edilmektedir. Örneğin yukarıdaki kodda, 20. satırda bulunan if koşuluna girilmesi için kullanıcının menüden 1’i seçmiş olması, diğer bir deyişle, klavyeden 1 yazarak enter’a basması gerekmektedir.

Kodumuzda öğrenci kayıtlarını tutacağımız için bir oluşum (composition) kullanmamız ve bu oluşumu C dilinde yapılar (structs) kullanarak tanımlamamız mümkündür:

Yukarıda, örnek bir öğrenci yapısı (struct) gösterilmektedir. Kodun 5-9.  satırları arasında bu yapıyı oluşturan değişken tipleri tanımlanmıştır. Ayrıca yapının ismi “ogrenci” olarak tanımlanmıştır.

Kodumuzdaki main fonksiyonu içerisinde, 12. satırda, ogrenci yapısından bir tip oluşturulmakta ve bu yeni tipe xyz ismi verilmektedir. Bu tip, C dilinde tanımlı olan diğer tipler gibi (örneğin int, char, float) bir tip olmakta ve bu tipten yeni değişkenler tanımlamamıza imkan tanımaktadır.

Kodumuzdaki seçimlere göre çalışacak olan kayıt ekleme ve silme işlemlerini aşağıdaki şekilde kodlayabiliriz. Öncelikle kayıt ekleyen kısma bakalım:

Yukarıdaki kodda, 21. satırda xyz tipinde bir değişken tanımlanıp, ardından 22-29. satırlar arasında bu değişkenin içerisine klavyeden değer okunmuştur. Okunan değerler yapı (struct) içerisinde ilgili değişkenlere yerleştirilmiş ve hafızada tutulmaktadır.

Kodun 30. satırında bir dosya göstericisi tanımlanıp, göstericinin “kayit.txt” dosyasını göstermesi sağlanmıştır. Buradaki dosyanın açılış şekli, “a” parametresinden de anlaşılacağı üzere ekleme (append) halindedir.

Kodun 31. satırında fprintf fonksiyonu marifetiyle fp göstericisinin gösterdiği yani “kayit.txt” dosyasına okunan yapısındaki isim, soyisim ve no değişkenlerinin değeri bastırılmakta ve nihayetinde 32. satırda dosya kapatılarak kayıt işlemi tamamlanmaktadır.

Kayıtlar arasında arama işlemi yapan kod kısmı ise aşağıda verilmiştir:

Yukarıdaki kodun, 36. satırında, aranan ismi tutmak amacıyla bir dizgi (string) tanımlanmış ve bu değişkenin içerisine kullanıcıdan aranması istenen değer 37. satırda scanf ile okunmuştur.

38. satırda, dosya okuma şeklinde (read) açılmış ve fp isimli dosya göstericisine atanmıştır.

42. satırda feof fonksiyonu ile dosyanın sonuna kadar dönen bir döngü tanımlanmıştır. Buradaki döngü fp göstericisinin dosya sonunu göstermesi durumunda 1 döndürmektedir. Dolayısıyla dosya sonuna kadar 1 dönmesini ve dosya sonuna ulaşılınca 0 dönmesini sağlamak maksadıyla ! işaretiyle dönen değerin tersi alınmaktadır. While döngüsü kısaca dosya sonuna kadar dönen bir döngü halini almıştır.

Döngünün içindeki 43. satırda, dosyadan fscanf fonksiyonu ile okunan isimli yapının içerisine değerler okunmaktadır.

44. satırda okunan değerlerden isim bilgisi, aranan dizgi (string) ile karşılaştırılmakta ve eşitlerse 45. satırdaki printf fonksiyonu çalışmakta ve ekrana aranan öğrenci bilgisini yazmaktadır. Eşit olmaması durumunda bir sonraki öğrenciye devam edilmektedir.

Kodun tamamı aşağıdaki şekildedir:

Kodu indirmek için tıklayınız

Yorumlar

  1. Yılmaz

    Merhaba, ben bu program üzerinden “isim” veya “soyisim” kısmı ile değil, “no”ya göre arama yapmak istiyorum ama bir türlü bunu uyarlayamadım. Numaraya göre aramayı nasıl yapabilirim?

  2. Şadi Evren ŞEKER Article Author

    Yapmanız gereken tekşey string okumak yerine integer sayı okumaktır. Bunun için kodun 36 ve 37. satırlarını aşağıdaki şekilde değiştirerek, değişken tipini int’e çevirmeniz gerekir:

    int aranan;
    scanf(“%d”,&aranan);

    ardından arama işleminin yapıldığı if koşulu içerisinde string karşılaştırmak için kullanılan strcmp fonksiyonu yerine, int karşılaştırması yapmanız gerekir. Kısaca kodun 44. satırını aşağıdaki şekilde değiştirmeniz yeterlidir:

    if(aranan == okunan.no){

    yukarıdaki 3 satırı anlatıldığı gibi değiştirirseniz, istediğiniz şekilde öğrnecileri numaralarına göre arar. bu durumu 35. satırda bulunan printf içerisindeki mesajda da düzeltebilirsiniz.

    başarılar

    1. talebe

      Hocam benim bir metin dosyasına herhangi bir yazı dizini yazıp bunu 8 karekter 8 karakter alt alta yazdırmam ve en alttaki 8 karakteri tekrar alıp başka bir dosya içerisinde en başa ondan sonra gelen ikinci 8 karakteri onun yanına sonra geleni tekrar alt satıra şeklinde bütün metin dosyasını işlemem gerekiyor. Bunun için yardımcı olursanız sevinirim.

  3. Banshee

    hocam bu kodu ilk açtığım zaman sorunsuz çalışıyor kapadıktan sonra tekrar açtığımda daha önce yazılmış bir ismi aratınca windows hata veriyor sorun bendemidir yoksa koddamıdır

  4. ali

    Arkadaşlar diyelim ki bir öğrenci burdaki gibi tek ders değilde birden fazla ders alıyorsa o zaman o öğrencinin aldığı bütün derslerin isimlerini vizelerini finallerini arama yaptırarak nasıl okuttururuz.Lütfen cevap verin.Teşekkürler.

  5. Şadi Evren ŞEKER Article Author

    böyle bir problemin çözümü için ilişkisel veri tabanı mantığı en kolay çözüm olur. Aksi halde çok ciddi miktarda veri tutmanız ve oldukça uzun süre bir işlem için beklemeniz gerekir.

    Basitçe veri tabanı teorisinde olduğu gibi bu bahsettiğiniz konuyu tablolara bölün.

    Örneğin dersler için ayrı bir tablo, sınavlar için ayrı bir tablo ve öğrenciler için ayrı bir tablo.

    Sonra bu tablolar arasında çokta çoka (many-to-many) ilişkileri tanımlayıp ilişki tablolarınızı oluşturun.

    Ardından bütün bu tabloları birer dosyada tutun.

    başarılar

  6. ali

    Şöyle diyim şimdi ben iç içe struct kullanarak öğrencileri aldığı dersleri derslerin vize ve finallerini bir dosyaya yazdırdım.Şimdi herhangi bir öğrenci numarasına göre arama yaptırıcam ve o öğrencinin vize ve final notlarını ekrana çıkartıcam.Şimdi ben aramayı nasıl yaprıtıcam onu bilmiyorum.Yarım ederseniz sevinirim.

  7. ali

    Ha bir de öğrencinin sadece bir dersi yok birden fazla dersi var.Ben şöyle yaptım ama çalışmıyor.
    if(aranan==ogr.no) break;
    printf(“”ogr.adi,ogr.soyadi,ogr.aldigiders.dersadi,ogr.aldigiders.vize,ogr.aldigiders.final);

  8. filiz

    mrb. birşey sormak istiyorum bu işe yeni başladım henüz.bir sayfa yaptım ve yaptığım sayfanın mesela açıklama bölümünü txt dosyasından yönlendirmek istiyorum.yani sayfada açıklama bölümünde değişme olacağı zaman o txt den değiştireyim.dosya işlemleri ile bunu nasıl yapabilirim…..

  9. Şadi Evren ŞEKER Article Author

    sorunuzda açık olmayan bir nokta var, “bir sayfa yaptım” demişsiniz. Bununla neyi kastediyorsunuz?

    Elbette bir txt dosyasındaki bilgiyi bahsettiğiniz üzere programınız içinden okuyup, değişiklikleri kolayca güncellemek için kullanabilirsiniz, ancak sorunuzda “sayfa” kavramı ile neyi anlatmak istediğinizi açarsanız, daha fazla yardımcı olabilirim. Malum bilgisayar bilimleri çok geniş ve “sayfa” kelimesi pek çok farklı yer ve anlamda kullanılıyor 🙂

    başarılar

  10. çağla

    40 ile 41 deki malloc fonksiyonunu nasıl kullandığınızı açıklayabilir misiniz ? teşekkürler

  11. Şadi Evren ŞEKER Article Author

    Bu satırlarda bulunan malloc fonksiyonu, temel olarak bir stringi (char *) tanımlamaya yarar. Bilindiği üzere dizgiler (String) birer karakter dizisidir. Bu dizileri, gösterici (pointer) ile tutmak da mümkündür. Kodda da yapılan işlem aynen budur, yani bir char göstericisi, bir char dizisini göstermektedir. Bu gösterilen diziye de string yerleştirilmiştir.

    Elbette gösterici (pointer) ile bir dizi tanımlama konusundaki en önemli fark, klasik tanımlamaya göre (örneğin char a[100] şeklindeki dizi tanımı), boyutunun verilmemesidir. Bu bize dinamik boyutta dizi tanımlama imkanı sunar. Örneğin 5 karakterli bir kelime ile 500 karakterli bir kelimenin boyutları için hafızada tam olarak gereken yeri ayırabiliriz.
    Bu yer ayırma işini ise malloc fonksiyonu yapar. içerisine aldığı boyut kadar hafızada yer ayırır ve göstericimiz bu yeri gösterir.

    Örneğimizde isim=(char *)malloc(sizeof(char) * 100); satırı, öncelikle sizeof(char) fonksiyonu ile bir karakterin hafızada(ram) kapladığı alanı almakta, ardından bunu 100 ile çarpmakta (yani toplamda 100 karakterlik alan) ve bu hesaplanan değer kadar yeri hafızada ayırarak isim göstericisinin göstermesini sağlamaktadır.

    Kısacası en fazla 100 karakterden müteşekkil bir dizgiyi “isim” isimli değişkene koyabilmektedir.

    başarılar

  12. Şadi Evren ŞEKER Article Author

    Bakın saydığınız özelliklerden en basiti listeleme. Bunun için yukarıdaki kodda, 44. satırda bulunan if koşulunu kaldırmanız yeterlidir (veya bu if bulunmadan yeni bir seçeneği menüye eklemek). bu bir çözüm olur çünkü yukarıdaki kodda 42. satırda bulunan döngü, dosyanın sonuna kadar okuma yapmakta ve okunan her satırı, 44. satırdaki if koşulu ile kontrol etmektedir. Şayet bu if koşulu kalkarsa, okuduğu her değeri ekrana basar ve bu durumda bütün dosyayı listelemiş olursunuz.

    Silme işlemi için ne yazık ki bu basit dosyalama yapılarında çok başarılı bir çözüm bulunmuyor. Silme sırasındaki en büyük problem, veri silindikten sonra oluşan boşluğun kapatılması. Örneğin aşağıdaki şekilde verilerin bir dosyada bulunduğunu düşünün :

    ABCDEF

    Bu verilerden örneğin C silinecek olursa, DEF bilgilerinin kaydırılması gerekir. Kaydırma işlemi ise bütün dosyanın yeniden okunup silinecek olan veri atlanarak yeniden yazılması demektir. Adım adım yazacak olursak:

    Bütün veriyi (veya bir kısmını), dosyadan hafızaya (RAM) oku.
    Okunan veriyi dosyaya yaz.
    Şayet yazma sırasında silinecek veriye rastlarsan bu veriyi atla.

    Değiştirme işlemi de silmeye benzer yapılabilir. Bu işlem için aşağıdaki adımlar izlenebilir:

    Bütün veriyi (veya bir kısmını), dosyadan hafızaya (RAM) oku.
    Okunan veriyi dosyaya yaz.
    Şayet yazma sırasında silinecek veriye rastlarsan bu veriyi değiştirerek yaz.

    Fakat değiştirme işleminde, silmeye göre bir avantajımız, dosyadaki diğer verilerin yazılmasını gerektirmemesdir. Bu durumda dosya göstericisi, örneğin fseek komutu kullanılarak dosya üzerinde ilgili konuma hareket ettirilebilir ve bu konumda yazma işlemi yapıldığında eski verinin üzerine yazılarak, eski veri silinmiş olunur. Uygun bir zamanda, yukarıdaki anlatıma fseek komutunun nasıl çalıştığını ekleyip açıklamaya çalışırım.

    başarılar

  13. hanife

    okunan isim veya okunan soyisim kısmını anlamadım hocam size zahmet antabilir misiniz ayrıca benim bi prıje ödevim var ne yapacağımı bilmiyorum bana fikir önerebilirmisiz?

  14. Şadi Evren ŞEKER Article Author

    okunan yapısı (Struct), kodun 5-12 satırları arasında tanımlanan ve akabinde 21. satırda tanımlanan değişkendir. Dosyadan okuman istediğimiz bilgi tipini tutar. Buna göre okunan değişkeninde isim, soy isim ve no üyeleri bulunmaktadır. Yorumunuzda belirttiğiniz isim ve soyisim üyeleri, char * tipinde tanımlanmış birer dizgidir (String).

    başarılar

  15. Talha

    Merhabalar hocam,

    benim yazdığım kodda arama yapacağım zaman isime göre arama yapıyor fakat bir müddet sonra isime göre değilde soyada göre yapmaya başladı. Halbuki ben scanf e isime göre arama yapmasını yazmıştım ve strcmp de karşılaştırılan karakterler OgrAd ile ad karekteridir. Problem ne olabilir?

    printf(“degistirilcek kisinin adini girinizn”);
    scanf(“%s”,ad);

    while(!feof(fpDosya)){
    fscanf(fpDosya,”%s %s %s %d %d %d %d %dn”,OgrNo,OgrAd,OgrSoyad,&OgrYilici,&OgrYilsonu,&OgrOdev1,&OgrOdev2,&OgrSonuc);
    if(strcmp(OgrAd,ad)==0){

  16. Emre

    Elinize sağlık çok yardımcı oldu bu yazı gerçekten türkçe kaynak bulmakta zoruluk çekiyordum.Eğer ilgilenirseniz bir sorum olacak;

    scanf fonkisyonunda sayıları alırken inputun başına “&” koymuşuz oysa string alırken bu karakter yok sebebi nedir acaba ,teşekkürler.

  17. killer

    Hocam elinize saglık siteyi yeni gordum. 2 sorum olacaktı:
    1)Dosyaya yazılan kayıttan bir kelimeyi klavyeden girilen bir kelimeyle değistirmek için ne yapmam gerekli.
    2)Dosyada kayıtlı bilgileri tersten yazdırmak için ne yapmalıyım.
    Şimdiden ilginize teşekkür ederim…

  18. Şadi Evren ŞEKER Article Author

    ilk sorunuzu ne amaçla soruyorsunuz? şayet basit dosya işlemleri için soruyorsanız iki yöntem izlenebilir:
    1. dosyanın içeriği tamamen hafızaya okunur (örneğin bir diziye) ilgili değişiklilker bu dizide yapılıp geri basılır
    2. dosyanın içeriği okunarak ikinci bir dosyaya yazılır. Bu okuyup yazma işlemi sırasında aranan kelime geçiyorsa bu kelime yazılmaz yerine değiştirilmesi istenen kelime yazılır.
    Yukarıdaki iki yöntemin dışında dosya üzerinde, dosyanın tamamını okumadan da değişiklik yapmanız mümkün. Örneğin bir veritabanı (database) kodlaması gibi amacınız varsa bu yöntem daha kullanışlı olur ama biraz daha karmaşıktır. Bunun için öncelikle dosyada aradığınız kelimenin nerelerde olduğunu bilmeniz gerekir (örneğin bir ağaç yapısı ile indeks olduğunu kabul edelim) ardındna buraya fseek ile gidip değişikliği yapmanız gerekir. Elbette kelime boylarını doğru hesaplamanız lazım aksi halde eski kelimeden hemen sonra başka kelimeler varsa ve eski kelimeden uzun bir kelime yazarsanız bu diğer kelimelerin üzerine yazılır.

    İkinci sorunuz için de siteye bir yazı ekledim aşağıdaki adresten erişebilirsiniz:

    http://www.bilgisayarkavramlari.com/2011/04/26/dosyayi-tersten-basan-kod/

    başarılar

  19. killer

    Hocam cevabınız için teşekkürler.
    1.sorudaki amacımı dun paylaşmıştım sanırım netle ilgili bi sıkıntı oldu.
    Dosyadaki “killer” kelimesindeki misal klavyeden ‘il’ harflerini ‘yu’ değiştirmek istediğimizde yani metini “kyuler” yapmak için sormuştum. Teşekkürler hocam…

  20. pc müh

    ben ödevimin bu kısmında takıldım rehber dosysını olusturdum ancak rehber dosyasıyla krum dosyası arasında nasıl bır baglantı kurup kontrol edıcem ornegın kurum dosyasında kullanıcının bır tc grmesını ıstıcem ve bu tcnın rehberde olup olmadıgını kontrol etmem gerek..(Kurum.txt: Bu dosyada yönetici ile aynı kurumda çalışanların bilgileri bulunacaktır. Bu dosyada bulunan kişilerin hepsi Rehber.txt dosyasında bulunmak zorundadır; ancak Rehber.txt dosyasındaki her kişinin Kurum.txt dosyasında bulunma gibi bir zorunluluğu yoktur.)

  21. Şadi Evren ŞEKER Article Author

    sorunuz, kurum.txt dosyasını nasıl oluşturacağınız mı? yani bir dosyadan, belirli kriterlerle (aynı kurumda çalışmak gibi) veri çerek ikinci bir dosyaya mı atmak istiyorsunuz?

  22. Şadi Evren ŞEKER Article Author

    şayet dosyalarınız sıradan metin dosyaları ise ve binary değillerse ve üzerlerinde herhangi bir indeks bulunmuyorsa (örneğin verilerin sıralı olması gibi) bu durumda kullanabileceğiniz tek yol, ardışık bir şekilde (sequential) dosyadan veri okumak ve verilerden kriterleri sağlayanları ikinci dosyaya yazmak.

    while(!feof(fp1)){
       fscanf(fp1,"%s%s%s",tcno,isim,soyisim);
       int i = 0;
       while(strcmp(tcno,aranan[i++])!=0&&i
    

    Yukarıdaki gibi, fp1 ile gösterilen rehber.txt dosyasından okuyup, while ve if ile belirtilen kriterlere uygun olan tcno'lar (örnekte aranan isimli bir string dizisinde durduklarını kabul ettim), fp2 ile gösterilen kurum.txt dosyasına yazılmaktadır. Elbette yukarıdaki örnekte kullanılan iki adet doğrusal arama (linear search) algoritması, indeks yardımı ile daha verimli hale getirilebilir.

  23. mühendis

    hocam ,pc muh arkadasın sordugu soruyla ilgili bende birşey soracaktım .Benim takıldığım kısım şöyle rehber.txt ve kurum.txt diye dosyaları oluşturduk.Bu dosyalardaki kayıtlardan iki dosyadaki tc leri aynı olan kayıtların diğer bilgileride listelenicek.Bunu nasıl yapabilirim?

  24. Şadi Evren ŞEKER Article Author

    Bu problem biraz dikkat gerektiriyor gibi. Veriler üzerinde herhangi bir indeks bulunuyor mu? Yani basit şekilde performans hiçe sayılarak O(n2) maliyetinde bir kod yazılabilir ama indeks oluşturmak ve performansı arttırmak mümkün. Dosya yapıları hakkında daha fazla bilgi veririseniz daha zeki bir çözüm bulmaya çalışırız. Örneğin veriler sıralı mı?

  25. mühendis

    hocam,veriler üzerinde herhangi bir indeks bulunmuyor.Dediğiniz gibi basit şekilde sadece önce rehber.txt diye dosya oluşturduk.Bu dosyamızda tc,ad,soyad… gibi özellikleri kaydettik.Sonra diğer bir dosya kurum.txt,bu dosyada da bolum,gorev,tc … gibi özellikleri kaydettik.İşte bu noktada iki dosya arasında sadece tc değişkeni ortak olduğu için ,iki dosyanın tc lerini karşılaştırıp aynı ise rehber.txt dosyasında o tc deki kişinin adı ,soyadı…gibi rehber.txt deki bilgilerini ve sonra aynı tc li kişinin kurum.txt de de olduğunu bulduğu için ,o tc ye sahip kişinin bu dosyadaki bolum,gorev … gibi ozellikleriyle beraber listelensin istiyoruz.sorunumuz bu tam olarak oluşturmak hocam

  26. bendevarım

    hocam merhaba;
    rehber.txt ve kurum.txt mağduru olarak bende okutmayı yapmaya çalıştığımda windows hatası alıyorum ama program herhangi bir hata vermiyor.ayrı bir struct ta mı yapmam gerek acaba veriler mi karışıyor bilemedim.daha 3.dosyasıda var bu işin ona hiç başlayamadık bile:(

  27. Şadi Evren ŞEKER Article Author

    kodunuzu yollarsanız inceleyip cevap yazabilirim. Büyük ihtimalle gösterici (pointer) hatası yapıyorsunuz bu yüzden çalışma sırasında (runtime) hata alıyorsunuz.

  28. bendevarım

    teşekkür ederim hocam o sorunu hallettim while döngüsü içindeki scanf ile veri okuturken(&)işaretini kullanmadığım için oluşmuş:(( sadece şunu soracağım hocam sıralı bir dosyadan 2.satır 1. sütundan veriyi nasıl okutacağım sıralı dosyadan. kullandığım komut fscanf(dosya adı,”%s”,değişken) ama bu ilk veriyi veriyor bana sadece 9. veri yani 2.satır 1.sütundaki veri lazım.diğerlerini almamam gerek.

  29. Şadi Evren ŞEKER Article Author

    scanf veya fscanf , yapı olarak boşluk karakterinden dizgiyi (string) bölerler. Dolayısıyla birden fazla kelimeden oluşan bilgileri okumak için ya aşağıdaki şekilde birden fazla %s koymanız gerekir:

    fscanf(dosya,"%s%s%s%s",d1,d2,d3,d4);
    

    ya da bir döngü içerisinde kolon sayısı kadar döndürmeniz gerekir.

    boşluklar ile birlikte alan komut ise fgets() fonksiyonudur ve satır okur. Daha sonra bu satırı parçalamak için strtok() fonksiyonunu kullanarak string tokenizer ile satırı parçalamanız gerekir.

    Diğer bir yöntem ise dosyadan karakter karakter okuyup kelimeleri oluşup parçalamaktır. Bunun için fgetc() fonksiyonu kullanılabilir.

    Benim tavsiyem sizin gibi kaçıncı kelimenin alınacağının belirli olduğu durumlarda ilk yazdığım şekilde döngü kullanmanızdır:

    for(int i = 0;i<9;i++){
       fscanf(dosya,"%s",degisken);
    }
    

    şeklinde olaiblir

    başarılar

  30. bendevarım

    hocam son olarak 1. ve 3. dosyalar arası sorgulatma kaldı.. şöyleki 1.dosya rehber.txt ,2.dosya kurum.txt,3.dosya calisma.txt…anahtarlar sırasıyla rehber.txt de tc,kurum.txt de rehberdeki tc alacak sicilno girdirecek,calisma.txt de ise kurumdan sicili alacak ve maas hesabı yapacak.benim sorgum maaşı büyük olanın tc sini getir olacak.ama bir türlü 3.dosyadan maasi aratıp 1. dosyadan da tc sini okutup yazdıramadım.. 3den 1 e geçemedim bir türlü.projede struct ve fonksiyon kullandım.dizi yok.. blg.
    yarın sunumu var hocam projenin yardımcı olursanız duacınız olurum :)şimdiden teşekkürler…

  31. Şadi Evren ŞEKER Article Author

    Bu ifadeyi anlayamadım : “anahtarlar sırasıyla rehber.txt de tc,kurum.txt de rehberdeki tc alacak sicilno girdirecek,calisma.txt de ise kurumdan sicili alacak ve maas hesabı yapacak.”
    rehber.txt dosyasındaki anahtar tcno. Peki kurum ve çalışma.txt dosyalarının anahtarları da mı tc? maas hesabı diyerek neyi kastediyorsunuz?

    sanırım dosyalar üzerinden bağlantısal veri tabanı (relational database) tasarımı yapmışsınız. dosyalarınızı, kolonlarınızı ve anahtarlarınızı yazarsanız, ilave olarak da yapılarınızı (struct) da belirtirseniz ve tam olarak çalıştırmak istediğiniz sorguyu mümkünse SQL dilinde yazarsanız sanırım yardımcı olabilirim.

  32. bendevarım

    Rehber.txt Kurum.txt Calisma.txt KSN(Kurum sicil numarası)
    TCKN —–> TCKN TCKN(TC Kimlik numarası)
    KSN———-> KSN

    maaş hesabı yapacak dediğim Calisma.txt dosyasına girilen saat başı ücret,mesai saati gibi verilerle kişinin maaşını hesaplayacak olması.
    Örn sorgu: Maaşı >10.000 olan kişinin TCKN sini getir..
    Örn sorgu: Mesai saati > 5 olanları listele.. gibi olması gerek.

    Burada yapmaya çalıştığım girilen tc nin maaşını getirmek(ama çalışmıyor).Girilen tc rehber.txt de(1.dosya),istenen maaş çalışma.txt de(3.dosya)…

    printf("tc si kac olani getir :");
     scanf("%s",&T);
     flKn=fopen("Rehber.txt","r+"); 
    while(!feof(flKn))
               {
               fscanf(flKn,"%s",&KurumicinTC);                
                 if(strcmp(T,KurumicinTC)==0)
                      flKN1=fopen("Kurum.txt","r+");
                      while(!feof(flKN1))
                         {fscanf(flKN1,"%s",&CalismaicinKN); 
                          if(strcmp(CalismaicinKN,DosyadaKN)==0)
                          flKN2=fopen("Calisma.txt","r+");
                          for(i=0;i< =9;i++) {fscanf(flKN2,"%f",maasi);}  
                          printf("Maasi : %.2fn",maasi);
                          fclose(flKN2);fclose(flKN1);
                          getch();
                          system("cls");
                           menu();
                          }       
               }
    
  33. bendevarım

    SQL yanlış çıkmış tekrar gönderiyorum
    rehber.txt(TCKN)** ——> Kurum.txt(TCKN,KSN)
    Kurum.txt(KSN)** ——-> çalışma.txt

  34. seyma

    bir dosyadaki bilgileri diger dosyaya dizi kullanmadan tersten yazmak istiyorum yardımcı olabilir misin acaba şimdiden tşkler 🙂

  35. fatma

    dosya işlemlerini kullanarak a)20 adet öğrencinin no,ad,soyad ve not bilgilerini alarak”kayit.txt”sayfasına kaydeden prog.
    b)”kayit.txt” dosyasındaki öğrenci kayıtlarından en yüksek notu alan öğrencinin bilgilerini
    ekrana yazdıran kodu yazabilir misiniz.lütfen acill

  36. Şadi Evren ŞEKER Article Author

    Yazı içerisinde verilen kod zaten tam olarak sizin istediğinizi yapmıyor mu? Tek farkı ilave olarak not tutuyor olmanız ki bunu da no benzeri bir şekilde tutabilirsiniz.

    Bir dosyadaki en yüksek nota sahip kişiyi bulmak ise kodun ikinci kısmında yapılan (if kontrolündeki == 2 durumu) okumanın ardından en büyük sayı bulma kodu şeklinde çalışmalıdır. Örneğin bir değişken tutarak sürekli daha büyük not geldikçe güncelleyip, neticede bütün kayıtlara bakıldıktan sonra en büyük değerli kaydı ekrana bastırmak şeklinde.

    Başarılar

  37. Zeynep ER

    hocam dosyadan okunan kelimeleri bir diziye atayıp her kelimenin kaçıncı satırda olduğu bilgisini kelimelerle birlikte bir avl ağacında tutmamız lazım. fscanf le okuyup da tutmaya çalıştığımızda sorun çıkıyor nasıl yapabliriz acaba?

  38. Şadi Evren ŞEKER Article Author

    Veri ya dizide durur ya AVL ağacında. Hem AVL ağacı hem dizi olmaz.
    Sorunuza gelince aşağıdaki gibi bir kod işinizi görmeli:

    FILE *fp;
    fp=fopen("dosya.txt","r");
    int sayac= 0;
    char satir[200];
    while(!feof(fp)){
       sayac ++;
       fgets(fp,200,satir);
       char *kelime;
         kelime = strtok (satir," ,.-");
         while (kelime != NULL)
         {
           printf ("%s %dn",kelime,sayac);
           // AVL_EKLE(kelime,sayac);
           kelime = strtok (NULL, " ,.-");
         }
    }
    fclose(fp);
    

    Yukarıdaki kodu çalıştırıp test etmedim ama sanırım çalışması gerek. Kısaca dosyadan satır satır okuyup her satırı string tokenizer sayesinde parçalıyoruz ve kelimeleri alıyoruz. Her satır için sayaç kullanarak parçalama sonucunda kelime ve kaçıncı satırda olduğunu beraber ekrana yazıyoruz. Ayrıca yorum satırı olarak AVL ağacına ekleyeceğiniz yer de kodda gösteriliyor.

    Daha fazla bilgi için aşağıdaki yazıları okumanızda fayda olabilir:
    http://www.bilgisayarkavramlari.com/2008/12/20/string-tokenizer-dizgi-parcalayici/
    http://www.bilgisayarkavramlari.com/2008/05/15/avl-agaci-avl-tree/
    http://www.bilgisayarkavramlari.com/2008/05/15/agaclarda-dengeleme-rotation-balancing/

    Başarılar

  39. bil.ögr

    bende zeynep’in sorusuna benzer bir soru sormak istiyorum. dosyadaki kelimeleri diziye atacak o diziden döngüyle tek tek AVL ağacına ekleyecek daha sonra arama işlemini AVL ağac üzerinden gerçekleyecek. yazdığınız kod çalışıyor fakat ağaca atılmadığı için arama işlemini gerçekleştiremiyor.onun için ne yapmalıyım?

  40. Şadi Evren ŞEKER Article Author

    Sorunuzun dosya işlemleri ile ilgisi yok. AVL ağacı ile ilgili bilgiler daha önce yazdığım sayfaların bağlantılarında mevcut, bu sayfalara bakabilirsiniz.
    Yine de sorunuza cevap olması açısından AVL ağaçları ikili arama ağacı şeklindedir. Yapmanız gereken tek şey ikili arama ağaçlarına ekleme işlemini kodlamanız (ki bu konu ile ilgili yazılarda da gerekli kodları ve açıklamaları yayınlamıştım). İlave olarak derinliği ölçmeniz ve gerekli durumlarda ağacı dengelemenizdir. Yine de sorun yaşarsanız ilgili yazının altına yorum yazın, yardımcı olmaya çalışırım.

    Başarılar

  41. Burak

    merhabalar benim bir ödevim için dosya da arama yapmam gerekiyor ancak yazdığım kod ile sadece ilk satıra bakabiliyorum aradığım kitap 2. satırda ise bulunmadı diye uyarı veriyor. yazdığım kodu aşağı ekliyorum. nerede hatam olduğu konusunda beni bilgilendirirseniz çok sevinirim. 1 gündür bu hatayı düzeltmek için uğraşıyorum.

    kodlar aşağıda ki gibidir…

    printf("naramak istediginiz kitabin ismini yaziniz:"); 
    gets(arananad);
    rewind(f);
    		for (i=0;i
    			
  42. Şadi Evren ŞEKER Article Author

    Muhtemelen kodunuzun diğer kısılarında bir problem var. Kodunuzu okudum ve hata bulamadım. Emin olmak için sizin yolladığınız kodu esas alarak geri kalan kısmı hızlıca yazdım ve aşağıdaki şekilde kodda hata olmadan çalışıyor:

    SADIs-MacBook-Air:~ sadievrenseker$ vi dosyadeneme.c 
    
    #include 
    #include 
    typedef struct{
            char ad[5];
    }k;
    int main(){
            FILE *f;
            f = fopen("veri.txt","wb");
    
            int uzun = 5;
            char arananad[100];
            k kitap;
            strcpy(kitap.ad , "ali");
            fwrite(&kitap,uzun,1,f);
            strcpy(kitap.ad , "veli");
            fwrite(&kitap,uzun,1,f);
            strcpy(kitap.ad , "ahmet");
            fwrite(&kitap,uzun,1,f);
            strcpy(kitap.ad , "hasan");
            fwrite(&kitap,uzun,1,f);
            strcpy(kitap.ad , "sadi");
            fwrite(&kitap,uzun,1,f);
            fclose(f);
    
            printf("naramak istediginiz kitabin ismini yaziniz:");
            f=fopen("veri.txt","rb");
            gets(arananad);
            rewind(f);
            int sayi = 5;
            int sayac = 0;
                    int i;
                    for (i=0;i
    

    Örnek bir iki ekran çıktısı aşağıdaki şekilde:

    SADIs-MacBook-Air:~ sadievrenseker$ gcc dosyadeneme.c 
    SADIs-MacBook-Air:~ sadievrenseker$ ./a.out
    
    warning: this program uses gets(), which is unsafe.
    aramak istediginiz kitabin ismini yaziniz:ali
    
    Aranan kitap 1. kayittadir.SADIs-MacBook-Air:~ sadievrenseker$ ./a.out
    
    warning: this program uses gets(), which is unsafe.
    aramak istediginiz kitabin ismini yaziniz:ahmet
    
    Aranan kitap 3. kayittadir.SADIs-MacBook-Air:~ sadievrenseker$ ./a.out
    
    warning: this program uses gets(), which is unsafe.
    aramak istediginiz kitabin ismini yaziniz:veli
    
    Aranan kitap 2. kayittadir.
    

    Çok büyük ihtimalle dosyayı oluştururken veya struct yapısında hatalarınız olabilir.

    Başarılar

  43. can çetin

    Hocam merhaba.
    Ben dosyadan kullanıcı bilgisi okumak istiyorum ve bunları ağaca yerleştirmem gerekiyor.Fakat dosyda bazı kullanıcılar 2 bazıları 3(2 isim ,1 soyisim) isimli.Dolayısıyla kelime kelime okuma yapamıyorum.Okuduğum satırda eğer 3 isimli biri varsa iki ismi name adı altında kaydetmek istiyorum.
    Okumayı satır satır yaptım, sonrası için strtok fonksiyonuyla stringi parçaladım, parçaları isim ve soyisim içeren structa nasıl yerleştirebilirim.Teşekkürler.

  44. Şadi Evren ŞEKER Article Author

    Aynen bahsettiğiniz gibi en doğru yol satır okuyup sonra strtok ile parçalamaktır. Struct’a yerleştirmek için de aşağıdaki yöntemi izleyebilirsiniz.

    struct k{
     char isim[100];
     char ikinciisim[100];
     char soyisim[100];
    } kisi;
    
    int main(){
    FILE *fp;
    fp=fopen("dosya.txt","r");
    int sayac= 0;
    char satir[200];
    while(!feof(fp)){
       sayac ++;
       fgets(fp,200,satir);
       char *kelime;
         kelime = strtok (satir," ,.-");
         int ksayi = 0; // kelime sayacimizi 0 yapalim
         while (kelime != NULL)
         {
           
           if(ksayi == 0) // sayet 0. kelime ise kesinlikle isimdir
           {
              strcpy(kisi.isim , kelime);
           }
           if(ksayi == 1){ //başka kelime gelene kadar bu bir soy isimdir
              strcpy(kisi.soyisim,kelime);
           }
           if(ksayi == 2){ // sayet yeni bir kelime daha geldiyse, bir onceki ikinci isim bu soyisim demektir
              strcpy(kisi.ikinciisim, kisi.soyisim);
              strcpy(kisi.soyisim,kelime);
          }
          kelime = strtok (NULL, " ,.-");
          ksayi ++;
           
          
         }
    }
    fclose(fp);
    }
    

    kodu test etmedim ama sanırım çözüm anlaşılıyor. ilk okunan kelime her zaman isim, ikinci kelime okunduğunda soy isim. Şayet 3. kelime gelmezse işlem burada biter. Şayet 3. kelime gelirse soyismi ikinciisme kopyalar sonra gelen kelimeyi de soyisim yaparsınız.

    Bşaarılar

  45. hazel

    meraba benim proje ödevm var ve ve girilen bilgileri güncellemem lazm yaptığım program bi türlü çalışmadı yardımcı olursanız sevinirim…

  46. süleyman

    merhaba şadi hocam , dosya işlemlerinde güncelleme ve silme ve listeleme fonksiyonlarında problem yaşıyorum , uzun süre uğraştım ancak bir sonuca varamadım , yardımcı olursanız çok sevinirim , şimdiden çok teşekkür ederim.

        #include 
        #include 
        #include 
         
        struct ogrenci{
            int ID;
            int numara;
            char isim[40];
            char soyisim[40];
            int vize;
            int final;
            double ortalama;
        };
         
        void secimMenusu();
        void yeniKayit();
        void noKayitListele();
        void isimKayitListele();
        void kayitGuncelle();
        void kayitSil();
        void kayitlariListele();
        void textDosyasinaKaydet();
         
        int main(void)
        {
            secimMenusu();
            return 0;
        }
        void secimMenusu(FILE *dosya)
        {
            int secim;
         
            while(1)
            {
                printf("nLutfen yapmak istediginiz islemi seciniz : nn"
                   "[1 Dosyaya kayit ekle.                      ]n"
                   "[2 Ogrenci numarasina gore kayit listele.   ]n"
                   "[3 Ogrenci adina gore liste.                ]n"
                   "[4 Kayit guncelle.                          ]n"
                   "[5 Kayit silme.                             ]n"
                   "[6 Tum kayitlari listele.                   ]n"
                   "[7 Tum kayitlari text dosyasina kaydet.     ]n"
                   "[8 Programdan cik.                          ]nn"
                   "Seciminiz ? : ");
         
                scanf("%d",&secim);
                switch(secim)
                {
                    case 1:
                    yeniKayit();
                    break;
         
                    case 2:
                    noKayitListele(dosya);
                    break;
         
                    case 3:
                    isimKayitListele(dosya);
                    break;
         
                    case 4:
                    kayitGuncelle(dosya);
                    break;
         
                    case 5:
                    kayitSil(dosya);
                    break;
         
                    case 6:
                    kayitlariListele(dosya);
                    break;
         
                    case 7:
                    textDosyasinaKaydet();
                    break;
         
                    case 8:
                    printf("nProgram sonlandiriliyor..n");
                    exit(0);
                    break;
         
                    default:
                    printf("nLutfen gecerli bir secim yapiniz!..n");
                    break;
                }
            }
        }
        void yeniKayit()
        {
            FILE *dosya;
            struct ogrenci kayit={0,0,"","",0,0,0.0};
            int kayitID;
         
            printf("nLutfen kayit numarasi giriniz : ");
            scanf("%d",&kayitID);
         
            if((dosya=fopen("veritabani.db","ab+"))==NULL)
            {
                printf("nVeri tabanina erisimde sorun!..n");
            }
            else
            {
                fseek(dosya,(kayitID-1)*sizeof(struct ogrenci),SEEK_SET);
                fread(&kayit,sizeof(struct ogrenci),1,dosya);
         
                if(kayit.ID != 0)
                {
                    printf("n%d ID'si baska kayit icin kullaniliyor!..n");
                    yeniKayit(dosya);
                }
                else
                {
                    kayit.ID = kayitID;
                    printf("Ogrenci numarasini giriniz : ");
                    scanf("%d",&kayit.numara);
         
                    printf("Ogrenci ismini giriniz : ");
                    scanf("%s",&kayit.isim);
         
                    printf("%s'in Soyismini giriniz : ",kayit.isim);
                    scanf("%s",&kayit.soyisim);
         
                    printf("%s %s'in vize notunu giriniz : ",kayit.isim,kayit.soyisim);
                    scanf("%d",&kayit.vize);
         
                    printf("%s %s'in final notunu giriniz : ",kayit.isim,kayit.soyisim);
                    scanf("%d",&kayit.final);
         
                    kayit.ortalama =(double)0.4*kayit.vize + 0.6*kayit.final;
         
                    fseek(dosya,(kayit.ID-1)*sizeof(struct ogrenci),SEEK_SET);
                    fwrite(&kayit,sizeof(struct ogrenci),1,dosya);
                }
            }
            fclose(dosya);
        }
        void noKayitListele()
        {
            FILE *dosya;
            struct ogrenci kayit={0,0,"","",0,0,0.0};
            int arananNo;
            int bulundu=0;
         
            printf("nListelemek istediginiz ogrencinin numarasini  giriniz : ");
            scanf("%d",&arananNo);
         
            if((dosya=fopen("veritabani.db","r+b"))==NULL)
            {
                printf("nVeri tabanina erisimde sorun!..n");
            }
            else
            {
                while(!feof(dosya))
                {
                    fread(&kayit,sizeof(struct ogrenci),1,dosya);
                    if(kayit.ID != 0)
                    {
                        if(kayit.numara == arananNo )
                        {
                            bulundu++;
                            printf("n|----------Arama--Sonucu------------|n"
                            "nKayit bulundu.........n"
                            "n-------------------------------------n"
                            "Ogrenci No: %dn%s %snVize : %3dnFinal :%3d"
                            "nOrtalama :%3.2fn"
                            "n-------------------------------------n"
                            ,kayit.numara,kayit.isim,kayit.soyisim
                            ,kayit.vize,kayit.final,kayit.ortalama);
                        }
                    }
                }
            }
            if(bulundu == 0) printf("n%d Numarasina sahip ogrenci kayitlar arasinda bulunamadi!..n"
                                    ,arananNo);
            fclose(dosya);
        }
        void isimKayitListele()
        {
            FILE *dosya;
            struct ogrenci kayit={0,0,"","",0,0,0.0};
            char arananisim[40];
            int bulundu=0;
         
            printf("nListelemek istediginiz ogrencinin ismini giriniz : ");
            scanf("n%s",arananisim);
         
            if((dosya=fopen("veritabani.db","rb"))==NULL)
            {
                printf("nVeritabanina erisimde sorun!..n");
            }
            else
            {
                while(!feof(dosya))
                {
                    fread(&kayit,sizeof(struct ogrenci),1,dosya);
                    if(kayit.ID != 0)
                    {
                        if((strcmp(kayit.isim,arananisim))==0)
                        {
                            bulundu++;
                            printf("n|----------Arama--Sonucu------------|n"
                            "nKayit bulundu.........n"
                            "n-------------------------------------n"
                            "Ogrenci No: %dn%s %snVize : %3dnFinal :%3d"
                            "nOrtalama :%3.2fn"
                            "n-------------------------------------n"
                            ,kayit.numara,kayit.isim,kayit.soyisim
                            ,kayit.vize,kayit.final,kayit.ortalama);
                        }
                    }
                 }
            }
            if(bulundu > 1)
            {
                printf("nBirden fazla kayit listelendi!..n");
            }
            else
            {
                printf("n%s isimli bir ogrenci kayitlar arasinda bulunamadi!..n"
                        ,arananisim);
            }
            fclose(dosya);
        }
        void kayitGuncelle()
        {
            FILE *dosya;
            struct ogrenci kayit={0,0,"","",0,0,0.0};
            int kayitID;
         
            printf("nGuncellemek istediginiz kayitin ID'sini giriniz : ");
            scanf("%d",&kayitID);
         
            if((dosya=fopen("veritabani.db","a+b"))==NULL)
            {
                printf("nVeritabanina erisimde sorun!..n");
            }
            else
            {
                fseek(dosya,(kayitID-1)*sizeof(struct ogrenci),SEEK_SET);
                fread(&kayit,sizeof(struct ogrenci),1,dosya);
         
                if(kayit.ID == 0)
                {
                    printf("n%d. ID ye sahip kayit mevcut degil!..n",kayitID);
         
                }
                else
                {
                    printf("nDegistirilecek kayit ;n"
                            "%s %s nVize : %3dnFinal :%3dnOrtalama :%3.2fn"
                            ,kayit.isim,kayit.soyisim,kayit.vize,kayit.final,kayit.ortalama);
         
                    printf("%s %s'in Vize notunu giriniz : ",kayit.isim,kayit.soyisim);
                    scanf("%d",&kayit.vize);
                    printf("%s %s'in Final notunu giriniz : ",kayit.isim,kayit.soyisim);
                    scanf("%d",&kayit.final);
                    kayit.ortalama=(double)0.4*kayit.vize + 0.6*kayit.final;
         
                    fseek(dosya,(kayitID-1)*sizeof(struct ogrenci),SEEK_SET);
                    fwrite(&kayit,sizeof(struct ogrenci),1,dosya);
                }
            }
            fclose(dosya);
        }
        void kayitSil()
        {
            FILE *dosya;
            struct ogrenci kayit={0,0,"","",0,0,0.0};
            struct ogrenci bosKayit={0,0,"","",0,0,0.0};
            int kayitID;
         
            if((dosya=fopen("veritabani.db","ab"))==NULL)
            {
                printf("nVeritabanina erisimde sorun!..n");
            }
            else
            {
                rewind(dosya);
                printf("nLutfen silmek istediginiz kayit ID sini giriniz : ");
                scanf("%d",&kayitID);
         
                fseek(dosya,(kayitID -1)*sizeof(struct ogrenci),SEEK_SET);
                fread(&kayit,sizeof(struct ogrenci),1,dosya);
         
                if(kayit.ID == 0)
                {
                    printf("n%d ID'sine sahip kayit bulunamadi!..n",kayitID);
                }
                else
                {
                    fseek(dosya,(kayitID-1)*sizeof(struct ogrenci),SEEK_SET);
                    fwrite(&bosKayit,sizeof(struct ogrenci),1,dosya);
                }
            }
            fclose(dosya);
        }
        void kayitlariListele()
        {
            FILE *dosya;
            struct ogrenci kayit={0,0,"","",0,0,0.0};
            int bulundu=0;
         
            if((dosya=fopen("veritabani.db","rb+"))==NULL)
            {
                printf("nVeri tabanina erisimde sorun!..n");
            }
            else
            {
                while(!feof(dosya))
                {
                    fread(&kayit,sizeof(struct ogrenci),1,dosya);
                    if(kayit.ID != 0)
                    {
                        {
                            bulundu++;
                            printf("n|-------------------------------|n"
                            "ID :: %dnOgrenci No: %dn%s %snVize : %3dnFinal :%3dn"
                            "Ortalama :%3.2fn"
                            ,kayit.ID,kayit.numara,kayit.isim,kayit.soyisim
                            ,kayit.vize,kayit.final,kayit.ortalama);
                        }
                    }
                }
                printf("n|-------------------------------|n");
                fclose(dosya);
                if(bulundu == 0) printf("nVeritabani suanda bos!..n");
            }
        }
        void textDosyasinaKaydet()
        {
            FILE *dosyaOku;
            FILE *dosyaYaz;
            struct ogrenci kayit={0,0,"","",0,0,0.0};
         
            if((dosyaOku=fopen("veritabani.db","rb"))==NULL)
            {
                printf("nVeritabanina erisimde hata!..n");
            }
            else
            {
                if((dosyaYaz=fopen("veritabani.txt","w"))==NULL)
                {
                    printf("nDosya islemi basarisiz!..n");
                }
                else
                {
                    rewind(dosyaOku);
         
                    while(!feof(dosyaOku))
                    {
                        fread(&kayit,sizeof(struct ogrenci),1,dosyaOku);
                        if(kayit.ID != 0)
                        {
                            fprintf(dosyaYaz,"n|-------------------------------|n"
                            "ID :: %dnOgrenci No: %dn%s %snVize : %3dnFinal :%3dn"
                            "Ortalama :%3.2fn"
                            ,kayit.ID,kayit.numara,kayit.isim,kayit.soyisim
                            ,kayit.vize,kayit.final,kayit.ortalama);
                        }
                    }
                    fprintf(dosyaYaz,"n|-------------------------------|n");
                }
            }
            fclose(dosyaOku);
            fclose(dosyaYaz);
        }
    
  47. süleyman

    tekrar merhaba hocam , sorum güncel , biraz daha araştırdım denedim ancak yinede sorun yaşıyorum , dosyaya eklemede sorun yok , ancak listele dediğim zaman en son kaydı iki defa yazdırıyor , güncelleme işlemi yaptığım zaman güncellenmiş yeni bir kayıt oluşturuyor , eski kayıtla beraber listeleniyor. text dosyasına çevirme fonksiyonundada son kaydı iki kez yazma sorunu var.(dünyaca ünlü bir c kitabındada aynı sorun var) bir türlü işin içinden çıkamadım yardım ederseniz çok sevinirim

  48. fatma

    merhaba sadi hocam notlar ve programlar çok iyi.. benim de bi sorum olacaktı.. proje ödevim c de telefon defteri uygulaması geliştirmek.. kayıt ekle, arama, düzenleme, silme ve listeleme fonksiyonlarını kullanmam gerek.. net de bir çok örnek var ama hepsi eksik. birleştiremiyorum da.. ayrıca bütün örnekler banka hesap programı üzerine yazılmış örnekler. onları da telefon defterine çevirmeye çalışıyorum bir sürü hata veriyor. yardımcı olursanız çok sevinirim..

  49. süleyman

    fatma buradaki kodu rahatça değiştirebilirsin standart C de kodladım , gcc 4.4de derledim çalışıyor.
    ancak sıralı dosya yapısı kullandım , rasgele erişim olayını daha çözemedim hocamın yardımını bekliyorum.

    #include 
    #include 
    #include 
    typedef struct data {
        char name[40];
        char surname[40];
        int number;
        int midterm;
        int final;
        float graduate;
    }account;
    account record;
    account creatRecord();
    void writeToFile();
    int deleteByNumber();
    int listAllRecord();
    int deleteByName();
    int listAllRecord();
    
    int main (void)
    {
        int choice;
        while(1){
            printf("-----------------------------------n"
                    "[1 - Add new recond on file.      ]n"
                    "[2 - Delete an record by number.  ]n"
                    "[3 - Delete an record by name.    ]n"
                    "[4 - List all record.             ]n"
                    "[5 - exit to program.             ]n"
                    "-----------------------------------n"
                    );
            printf("Make your choice : ");
            scanf("%d",&choice);
            switch(choice){
                case 1: creatRecord();break;
                case 2: if(deleteByNumber()) printf("");
                        else printf("nFile is empty!..n");
                        break;
                case 3: if(deleteByName()) printf("");
                        else printf("nFile is empty!..n");
                        break;
                case 4: if(listAllRecord()) printf("");
                        else printf("nFile is empty!..n");
                        break;
                case 5:exit(1);break;
                default : printf("nPlease be careful!..n");
            }
        }
        return 0;
    }
    account creatRecord()
    {
        account record1;
        printf("Please enter the student's Name : ");
        scanf("%s",record.name);
        printf("Please enter the %s's Surname : ",record.name);
        scanf("%s",record.surname);
        printf("Please enter the %s %s's Number : ",record.name,record.surname);
        scanf("%d",&record.number);
        printf("Please enter the %s %s's Midterm result : ",record.name,record.surname);
        scanf("%d",&record.midterm);
        printf("Please enter the %s %s's Final result : ",record.name,record.surname);
        scanf("%d",&record.final);
        record.graduate = (float)((0.4*record.midterm)+(0.6*record.final));
        writeToFile();
    }
    void writeToFile()
    {
        FILE *file;
        if((file=fopen("accounts.dat","a"))==NULL){
            printf("nFile could not opened!..n");
        }else{
            fprintf(file,"%d %s %s %d %d %fn",record.number,record.name
                    ,record.surname,record.midterm,record.final,record.graduate);
        }
        fclose(file);
    }
    int deleteByNumber()
    {
        FILE *fileRead;
        FILE *fileWrite;
        int deleteNumber;
        int deleted=0,readed=0,writed=0,isempty;
    
        isempty=listAllRecord();
        if(isempty==0) return 0;
        printf("Please enter what you want to delete number : ");
        scanf("%d",&deleteNumber);
    
        if((fileRead=fopen("accounts.dat","r"))==NULL){
            printf("File could not open!..");
        }else{
                if((fileWrite=fopen("temp.dat","w"))== NULL){
                printf("File could not created!..");
             }else{
                while(!feof(fileRead)){
                    fscanf(fileRead,"%d %s %s %d %d %fn",&record.number,record.name
                    ,record.surname,&record.midterm,&record.final,&record.graduate);
                    readed++;
                    if(record.number != deleteNumber){
                        fprintf(fileWrite,"%d %s %s %d %d %fn",record.number,record.name
                        ,record.surname,record.midterm,record.final,record.graduate);
                        writed++;
                    }else{
                        deleted=1;
                    }
                }
                if(deleted && (writed!=readed)){
                    printf("n%d succesfuly deleted..n",deleteNumber);
                }else{
                    printf("n%d  not found!..n",deleteNumber);
                }
            }
        }
        record.number=0;
        fclose(fileRead);
        fclose(fileWrite);
        remove("accounts.dat");
        rename("temp.dat","accounts.dat");
    }
    int deleteByName()
    {
        FILE *fileRead;
        FILE *fileWrite;
        char deleteName[40];
        int deleted=0,readed=0,writed=0;
        int isempty;
    
        isempty=listAllRecord();
        if(isempty==0) return 0;
        printf("Please enter what you want to delete name : ");
        scanf("%s",&deleteName);
    
        if((fileRead=fopen("accounts.dat","r"))==NULL){
            printf("nFile could not open!..n");
        }else{
                if((fileWrite=fopen("temp.dat","w"))== NULL){
                printf("nFile could not created!..n");
             }else{
                while(!feof(fileRead)){
                    fscanf(fileRead,"%d %s %s %d %d %fn",&record.number,record.name
                    ,record.surname,&record.midterm,&record.final,&record.graduate);
                    readed++;
                    if(strcmp(record.name,deleteName)!=0){
                        fprintf(fileWrite,"%d %s %s %d %d %fn",record.number,record.name
                        ,record.surname,record.midterm,record.final,record.graduate);
                        writed++;
                    }else{
                        deleted=1;
                    }
                }
                if(deleted && (writed!=readed)){
                    printf("n%s succesfuly deleted..n",deleteName);
                }else{
                    printf("n%s  not found!..n",deleteName);
                }
            }
        }
        record.number=0;
        fclose(fileRead);
        fclose(fileWrite);
        remove("accounts.dat");
        rename("temp.dat","accounts.dat");
        return 1;
    }
    int listAllRecord()
    {
        FILE *file;
        int recordNumber=0;
        if(record.number==0)return 0;
        if((file=fopen("accounts.dat","r"))==NULL){
            printf("nFile could not opened!..n");
        }else{
            while(!feof(file)){
                recordNumber++;
                fscanf(file,"%d %s %s %d %d %fn",&record.number,record.name
                ,record.surname,&record.midterm,&record.final,&record.graduate);
    
                printf("nNumber    :%-5d nName      :%-10s nSurname   :%-10s n"
                       "Midterm   :%-5d nFinal     :%-5d nGraduate  :%-3.2fn"
                       ,record.number,record.name,record.surname
                       ,record.midterm,record.final,record.graduate);
            }
            if(recordNumber && record.number!=0){
                printf("n%d record listed..n"
                       "-----------------------------------n",recordNumber);
            }else{
                //printf("nFile is empty..n");
                fclose(file);
                return 0;
            }
        }
        fclose(file);
        return 1;
    }
    
  50. fatma

    teşekkürler süleyman.. burada değiştirmem gereken çok şey var. code blocks kullanıyorum ve sanırım komutlar farklı bunu bile çalıştırmadı çok hata verdi:/

  51. süleyman

    codeblocks’ta derledim bende , compiler gcc4.4 ancak buraya yapıştırırken sorun olmuş olabilir. pastebin linki vermiştim ancak moderatör kaldırmış linki ,include önişlemci komutlarında hatalar var string.h , stdlib.h ve stdio.h headerlarını import etmen gerekli tek sorun onlar gözüküyor

  52. Şadi Evren ŞEKER Article Author

    Süleyman Bey;

    Öncelikle teşekkür ederim verdiğiniz cevap ve yardımınızdan dolayı. Sorunuzla yoğunluğumdan dolayı ancak ilgilenebiliyorum. Probleminiz feof kullanıyor olmanız. Bu meşhur bir durumdur ve verdiğiniz yapıda bir kere ilave olarak girer çünkü feof bayrağı (flag) kalkması için bir kere eof okunması gerekir. Yani siz dosya sonuna geldiğinizi anlama için bir kere dosya sonu bilgisini okumalısınız. Bu okumadan sonra basıyorsunuz ve ancak daha sonra while döngüsünden çıkıyorsunuz.

    bunun yerine fread fonksiyonunu while döngüsüne vermelisiniz.

    while(fread(&kayit,sizeof(struct ogrenci),1,dosya))
                {
    

    Şeklinde kodunuzu değiştirebilirsiniz.

    Başarılar

  53. fatma

    bende şöyle bi program yaptım.. ancak az bi hatam var.. onları düzeltemiyorum.. yardımcı olursanız sevinirim…

    #include 
    #include 
    
    
    typedef struct
    {
        int no;
        char isim[20];
        double tel;
    }rehberyapi;
    
    FILE *kp;
    
    rehberyapi rehber;
    int rehber_no;
    char rehber_ad;
    long int telefon_no;
    
    
    void giris(void);
    void liste(void);
    void silme(void);
    void arama(int );
    void duzenleme(void);
    int main()
    {
      char c;
    
      kp = fopen("rehber.txt", "r+");
        if (kp == NULL)
          kp = fopen("rehber.txt", "w+");
    
      do {
          system("cls");
          printf("n[1] - YENI KAYIT");
          printf("n[2] - KAYIT NUMARASI ILE ARAMA");
          printf("n[3] - ISIM ILE ARAMA");
          printf("n[4] - KAYIT DUZENLEME");
          printf("n[5] - KAYIT SILME");
          printf("n[6] - LISTELEME");
          printf("n[7] - CIKIS");
          printf("nnn SECIMINIZ = ");
         c = getch();
         switch (c) {
             case '1': giris(); break;
             case '2':  arama(1); break;
             case '3':  arama(2); break;
             case '4': duzenleme(); break;
             case '5': silme(); break;
             case '6': liste(); break;
             }
      } while(c !='7');
      fclose(kp);
    }
    void giris(void)
    {
    
      rehber_no=filelength(fileno(kp))/ sizeof(rehberyapi);
      printf("nRehber numarasi : %dn",rehber_no);
      printf("isim soyisim : "); scanf("%s",&rehber_ad);
      printf("telefon numarasi   : "); scanf("%ld", &telefon_no);
    
    
    
      fseek(kp, rehber_no*sizeof(rehberyapi), 0); // IMLECI KONUMLANDIR
      fwrite(&rehber, sizeof(rehberyapi), 1, kp);
    
      fflush(kp);
      //fflush(FILE *) tampon bellektekiler diske yazylyr
    
    }
    
    void liste(void)
    {
      system("CLS");//clrscr();
      fseek(kp, 0, 0);
      fread(&rehber, sizeof(rehberyapi), 1, kp);
       printf("nRehber Numarasit Isim Soyisimt Telefon Numarasi  nn");
      while (!feof(kp)) {
         if(strcmp(rehber_ad,""))
          printf("n%d t %s t %ld", rehber_no,&rehber_ad,telefon_no);
          fread(&rehber, sizeof(rehberyapi), 1, kp);
      }
      printf("nn Devam icin herhangi bir tusa basin");
      getch();
    }
    
    void silme(void)
    { int silno;
      printf("nSilinecek Rehber no : ");scanf("%d",&silno);
      fseek(kp, silno*sizeof(rehberyapi), 0);
      fread(&rehber, sizeof(rehberyapi), 1, kp);
    
    
      printf("nRehber numarasý : %d",rehber_no);
      printf("nÝsim Soyisim : %s",&rehber_ad);
      printf("ntelefon numarasý   : %ld",telefon_no);
      printf("nSYLYNECEK KAYIT BU MU? ");
      char ch=getch();
      if (ch == 'E' || ch == 'e')
          {strcpy(rehber_ad,"");
           telefon_no=0;
           fseek(kp, silno*sizeof(rehberyapi), 0);
           fwrite(&rehber, sizeof(rehberyapi), 1, kp);
           printf("nKAYIT BASARIYLA SILINDInn");
          }
      else
       { printf("KAYIT SILINMEDI");
       }
        printf("nn Devam icin herhangi bir tusa basin");
      getch();
    }
    
    void arama(int x)
       {  int ara;
          char ara1[20];
          int ksay;
          int durum=1;
          if(x==1)
         { printf("nAranacak rehber no : ");scanf("%d",&ara);
           ksay=filelength(fileno(kp))/ sizeof(rehberyapi);
           fseek(kp, ara*sizeof(rehberyapi), 0);
           fread(&rehber, sizeof(rehberyapi), 1, kp);
    
                if(strcmp(rehber_ad,"") && ksay>=ara)
                    {
                     printf("nRehber numarasý : %d",rehber_no);
                     printf("nÝsim soyisim : %s",&rehber_ad);
                     printf("ntelefon numarasý   : %ld",telefon_no);
                     }
          else
             printf("nKAYIT BULUNAMADI");
          }
     if(x==2){
      printf("nAranacak Isim : ");scanf("%s",ara1);
      fseek(kp, 0, 0);
      fread(&rehber, sizeof(rehberyapi), 1, kp);
    
         while (!feof(kp)) {
           if(!strcmp(rehber_ad,ara1))
           {
            printf("nRehber numarasi : %d",rehber_no);
            printf("nÝsim soyisim : %s",&rehber_ad);
            printf("ntelefon numarasi   : %ld",telefon_no);
            durum=0;
           }
            fread(&rehber, sizeof(rehberyapi), 1, kp);
          }
    
      if(durum)
             printf("nKAYIT BULUNAMADI");
    }
      printf("nn Devam icin herhangi bir tusa basin");
      getch();
    
    }
    
     void duzenleme(void)
    { int dno;
      printf("nDüzeltilecek telefon numarasi : ");scanf("%d",&dno);
      fseek(kp, dno*sizeof(rehberyapi), 0);
      fread(&rehber, sizeof(rehberyapi), 1, kp);
    
      printf("nRehber numarasi : %d",rehber_no);
      printf("nÝsim soyisim : %s",&rehber_ad);
      printf("ntelefon numarasi   : %ld",telefon_no);
      printf("nDUZELTILECEK KAYIT BU MU? ");
      char ch=getch();
      if (ch == 'E' || ch == 'e')
          {printf("nIsim soyisim : "); scanf("%s",&rehber_ad);
           printf("telefon numarasi: "); scanf("%ld", &telefon_no);
           fseek(kp, dno*sizeof(rehberyapi), 0);
           fwrite(&rehber, sizeof(rehberyapi), 1, kp);
           printf("nKAYIT BASARIYLA DUZELTILDInn");
          }
      else
       { printf("KAYIT DUZELTILMEDI");
       }
        printf("nn Devam icin herhangi bir tusa basin");
      getch();
    }
    
  54. fatma

    programı f9 compiler&run yapıyorum. konsol ekran da 1 işlem yapıyorum hemen kapanıyor.yeni kayıt girme, düzenleme, listeleme de hep oluyor.. konsol a yazdıklarım rehber.txt dosyasına da yazılmıyor..

  55. süleyman

    tekrardan merhaba hocam, kayıt güncelleme işlemi için şöyle bir fonksiyon yazdım ancak ,ID numarası verdiğimde ,ID numarasına sahip kayıt olmasına rağmen , verdiğim ID ye sahip kayıtın olmadığı hatasını veriyor , Hatamı bulamadım yardımcı olursanız çok sevinirim , şimdiden teşekkür ederim.

     void kayitGuncelle()
        {
            FILE *dosya;
            struct ogrenci kayit={0,0,"","",0,0,0.0};
            int kayitID;
    
            printf("nGuncellemek istediginiz kayitin ID'sini giriniz : ");
            scanf("%d",&kayitID);
    
            if((dosya=fopen("veritabani.db","a+b"))==NULL)
            {
                printf("nVeritabanina erisimde sorun!..n");
            }
            else
            {
                fseek(dosya,(kayitID-1)*sizeof(struct ogrenci),SEEK_SET);
                fread(&kayit,sizeof(struct ogrenci),1,dosya);
    
                if(kayit.ID == 0)
                {
                    printf("n%d. ID ye sahip kayit mevcut degil!..n",kayitID);
    
                }
                else
                {
                    printf("nDegistirilecek kayit ;n"
                            "%s %s nVize : %3dnFinal :%3dnOrtalama :%3.2fn"
                            ,kayit.isim,kayit.soyisim,kayit.vize,kayit.final,kayit.ortalama);
    
                    printf("%s %s'in Vize notunu giriniz : ",kayit.isim,kayit.soyisim);
                    scanf("%d",&kayit.vize);
                    printf("%s %s'in Final notunu giriniz : ",kayit.isim,kayit.soyisim);
                    scanf("%d",&kayit.final);
                    kayit.ortalama=(double)0.4*kayit.vize + 0.6*kayit.final;
    
                    fseek(dosya,(kayitID-1)*sizeof(struct ogrenci),SEEK_SET);
                    fwrite(&kayit,sizeof(struct ogrenci),1,dosya);
                }
            }
            fclose(dosya);
        }
    
  56. mesut

    struct kisi {

    char soyisim[15];

    char isim[15];

    char yas[2];

    };
    yapısının tanımlanmış olduğunu ve dosyanın yazma için açılmış olduğunu kabul edin.

    a) “isimyas.dat” dosyasını 100 kayıt içerecek şekilde ve bu kayıtların ilk içeriği, soyisim = “atanmadi” , ilkisim = “ ” ve yas = “0” olacak şekilde ilk değerlerini atayınız.

    b) 10 adet soyisim, isim ve yaş girdisi yaptırarak bunları dosyaya yazınız.

    c) Herhangi bir kaydı güncelleyiniz (değiştiriniz). Eğer bu kayıt daha önceden yapılmamışsa “Bu kayıt yok” yazdırınız.
    Herhangi bir kaydı a şıkkındaki ilk değerleri alacak şekilde siliniz.ödevim bu yardımcı olabilrimisiniz acil

  57. kubi

    hocam ne güzel yapmısınız programı ben bu nerden geldi bunu niçin yazıyoruz diye araştırmaktan yazmaya geçemiyorum kafam çok karışıyor ya hiç yapamazsam diye çok korkuyorum sizce hiç araştırmadan mantığnı kavramadan mı yazmalıyım?

  58. merve

    hocam basit bir hastane otamasyonu yapıcam öncelikle klinikle ilgli tüm bilgileri binary bi dosyaya yazıyorum daha sonra bu binary dosyadan mesela klinikle ilgli değişikler yapıcam o kliniği binary dosyasından nasıl bulcam

  59. süleyman

    merve , istediğin yapı buna benzer bir şeymi ? , bende güncelleme işleminde problem yaşıyorum, sordum hocama cevap bekliyorum , yapı buysa tek eksik kısmı değiştirilen kaydın tekrar dosyaya yazılması ,değiştirilen kaydı başarılı bir şekilde tekrar yazabiliyorsan kod paylaşırsan çok sevinirim.

    void kayitGuncelle()
    {
        FILE *dosya;
        struct klinik kayit;
        char klinikGuncelle[20];
        int klinikMevcut=0;
    
        if((dosya=fopen("veritabani.db","ab+"))==NULL)
        {
            printf("nVeritabanina erisimde sorun!..n");
        }
        else
        {
            printf("nGuncellemek istediginiz klinik ismini giriniz : ");
            scanf("%s",klinikGuncelle);
    
            while(fread(&kayit,sizeof(struct klinik),1,dosya)){
                if(strcmp(kayit.klinikAdi,klinikGuncelle)==0){
                    printf("------Klinik : %s",kayit.klinik);
                    //istenilen guncelleme islermeleri
                    // burada klinik turunde, kayit isimli degiskeninin icerigi
                    //degistirilip tekrar dosyaya yazilmali , bende bunu beceremedim 
                    // iki yorum once sordum hocama
                    klinikMevcut=1;
                }
            }
            if(klinikMevcut){
                printf("kayit basarili bir sekilde guncellendi.");
            }else{
                printf("Klinik bulunamadi!..");
            }
            
        fclose(dosya);
    }
    
  60. süleyman

    hocam sorum güncel , vaktinizden almak istemiyorum ama vaktiniz olursa , en azından mantıksal olarak rasgele erişimli bir dosyada kayıt güncelleme işleminin etkin yolunu söyleyebilirseniz çok sevinirim , şimdiden teşekkür ederim.

  61. cbasaranoglu Article Author

    süleyman bey,öncelikle kayıt güncelleme işleminin efektif hali yukarıda belirtilmiş sizin tam olarak istediğiniz nasıl bir çözüm biraz daha açıklarsanız yardımcı olmaya çalışırım
    teşekkürler

  62. süleyman

    ilginiz için teşekkür ederim sayin basaranoğlu , aslında merak ettiğim şu ; rasgele erişimli bir dosyaya kayıt girdikten sonra ,aynı kaydın üzerine başka veri yazılabilirmi ? (güncelleme) biraz daha açıklamak gerekirse diyelimki dosya başından itibaren 1000byte ileriye 40bytelik bir topluluğu kaydettim , kullanıcı tekrar 1000.byte’a gelip diğerlerinin üzerine (1000 ile 1040 arasına) farklı bir veri yazabilirmi ?
    fseek(dosyaKayıtçısı,sizeof(struct kayıtVerisi)*1000,SEEK_SET)
    kayıt işaretçim 1000.byte’da,
    fwrite(yeniKayitVerisi,sizeof(kayitVerisi),1,dosyaKayıtçısı);
    –bu verinin yazılmasında problem yok , ama 1000.byte’a tekrar gelip değiştirilmiş veri yazınca problem oluyor , mantık olarak hatalı bir işlemmi yapıyorum yoksa koddamı hata var tam bilemedim , bende iki farklı dosya açarak sorunu çözdüm ancak bu durumuda merak ediyorum. yardımcı olabilirseniz çok sevinirim, şimdiden teşekkürler.

  63. katniss

    cppde binary bir dosyayı değiştirip yeni bir binary dosya oluşturmam gerek.dosya oluşturmada sıkıntı çekiyorum.yardımcı olabilir misiniz?aynı dosya üzerinde işlem yapılan hali şöyle:

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    /**
       Processes a pixel by forming the negative.
       @param blue the blue value of the pixel
       @param green the green value of the pixel
       @param red the red value of the pixel
    */
    void process(int& blue, int& green, int& red)
    {
       blue = 255 - blue;
       green = 255 - green;
       red = 255 - red;
    }
    
    /**
       Gets an integer from a binary stream.
       @param stream the stream
       @param offset the offset at which to read the integer
       @return the integer starting at the given offset
    */
    int get_int(fstream& stream, int offset)
    {
       stream.seekg(offset);
       int result = 0;
       int base = 1;
       for (int i = 0; i < 4; i++)
       {
          result = result + stream.get() * base;
          base = base * 256;
          cout << stream.get() << endl;
       }
       return result;
    }
    
    int main()
    {
      
    
       fstream stream;
       // Open as a binary file
       stream.open("resim.bmp", ios::in | ios::out | ios::binary);
       
       int file_size = get_int(stream, 2); // Get the image dimensions
       int start = get_int(stream, 10);
       int width = get_int(stream, 18);
       int height = get_int(stream, 22);
    
       // Scan lines must occupy multiples of four bytes
       int scanline_size = width * 3;
       int padding = 0;
       if (scanline_size % 4 != 0)
       {
          padding = 4 - scanline_size % 4;
       }
    
       if (file_size != start + (scanline_size + padding) * height)
       {
          cout << "Not a 24-bit true color image file." << endl;
          system("pause");
          return 1;
       }
       
       int pos = start;
    
       for (int i = 0; i < height; i++) // For each scan line
       {
          for (int j = 0; j < width; j++) // For each pixel
          {
             stream.seekg(pos); // Go to the next pixel
             int blue = stream.get(); // Read the pixel
             int green = stream.get();
             int red = stream.get();
    
             process(blue, green, red); // Process the pixel
    
             stream.seekp(pos); // Go back to the start of the pixel
    
             stream.put(blue); // Write the pixel
             stream.put(green);
             stream.put(red);
             pos = pos + 3;
          }
    
          stream.seekg(padding, ios::cur); // Skip the padding
       }
       system("pause");
       return 0;
    
    

    stream.put(blue) kısımlarını aktaracağım dosya olan sonuc.put(blue) şeklinde değiştirdim ancak yeterli olmadı.

  64. Ozan

    hocam bi program yapmaya calıstım bu dosya islemleri ile ilgili kod soyle:

    #include 
    #include 
    #include 
    #include 
    struct menu{
          char*yiyecek;
          char*tur;
          int fiyat;
               };
               struct menu deger;
               int toplam=0;
    void menu();
    void y();
    void t();
    void f();
    void menu2();
    void ekle();
    void  tara();
    void hesapla();
    int main(){
        menu();
        getch();
        return 0;
    }
    void menu(){
         int secim;
         printf("n1-Ekleme yapmak icin tiklayiniz:");
         printf("n2-İstenilen bilgileri gormek icin tiklayiniz:");
         printf("n3-Tutari hesaplamak icin tiklayiniz:");
         printf("nSeciminizi giriniz:");
         scanf("%d",&secim);
         switch(secim){
                       case 1:
                            ekle();
                            break;
                            case 2:
                                 tara();
                                 break;
                                 case 3:
                                      hesapla();
                                      break;
                                      }
                                      }
                                      void ekle(){ 
        
        
                                       
        deger.yiyecek=(char*)malloc(sizeof(char)*100);                
        printf("nYiyecek adini giriniz:");
        scanf("%s",deger.yiyecek);
        deger.tur=(char*)malloc(sizeof(char)*100); 
        printf("nYiyeceğin turunu giriniz:");
        scanf("%s",deger.tur);
        printf("nYiyecek fiyatini giriniz:");
        scanf("%d",&deger.fiyat);
        FILE*dosya=fopen("sparis.txt","w");
        if(dosya==NULL){
                        printf("Dosya acilamadi");
                        }
        
                        fprintf(dosya,"n%s %s %d",deger.yiyecek,deger.tur,deger.fiyat);
                        fclose(dosya);
                        printf("nMenuye donmek icin lutfen bir tusa basininiz:");
                        getch();
                        menu();
                        }
                        void tara(){
                        menu2();
                        getch();
                        }
                        
                     void menu2(){                      
                          int secim2;
                          printf("n1-Yiyecek adina gore arama:");
                          printf("n2-Ture gore arama:"); 
                          printf("n3-Fiyatına gore arama");
                          printf("nSeciminizi giriniz:");
                          scanf("%d",&secim2);
                          switch(secim2){
                                         case 1:
                                              y();
                                              break;
                                              case 2:
                                                   t();
                                                   break;
                                                   case 3:
                                                        f();
                                                        break;
                                                        }
                                                        }
                                                        
                          void y(){
                               
                               char aranan[100];
                               deger.yiyecek=(char*)malloc(sizeof(char)*100);
                               printf("Aranan yiyecek ismini giriniz:");
                               scanf("%s",aranan);
                               
                              
                               
                             FILE*dosya=fopen("sparis.txt","r");
                               if(dosya==NULL){
                                               printf("Dosya acilamadi");
                                               }
                          
                          while(!feof(dosya)){
                                              fscanf(dosya,"n%s",aranan);
                                              if(strcmp(aranan,deger.yiyecek)==0){
                                                                                  printf("n%s %s %d",deger.yiyecek,deger.tur,deger.fiyat);
                                                                                  }
                                                                                  }
                                                                                  printf("nAna  menuye donmek icin bir tusa basiniz...");
                                                                                  getch();
                                                                                  menu();
                                                                                  } 
                                                                                  void f(){
                                    int aranam;
                                    printf("Aranan yiyecek isminin fiyatini giriniz:");
                               scanf("%d",&aranam);
                              
                              
                               
                             
                             
                               FILE*dosya=fopen("sparis.txt","r");
                               if(dosya==NULL){
                                               printf("Dosya acilamadi");
                                               }
                          while(!feof(dosya)){
                                              fscanf(dosya,"n%d",&aranam);
                                              if(aranam==deger.fiyat){
                                                                                  printf("n%s %s %d",deger.yiyecek,deger.tur,deger.fiyat);
                                                                                  }
                                                                                  }
                                                                                  printf("nAna  menuye donmek icin bir tusa basiniz...");
                                                                                  getch();
                                                                                  menu();
                                                                                  } 
                                                                                  void t(){
                                                                                 
                              
                               char aranan[100];
                               deger.tur=(char*)malloc(sizeof(char)*100);
                               printf("Aranan yiyecegin turunun ismini giriniz:");
                               scanf("%s",aranan);
                               
                             
                               
                               FILE*dosya=fopen("sparis.txt","r");
                               if(dosya==NULL){
                                               printf("Dosya acilamadi");
                                               }
                                               deger.tur=(char*)malloc(sizeof(char)*100);
                          while(!feof(dosya)){
                                              fscanf(dosya,"n%s",aranan);
                                              if(strcmp(deger.tur,aranan)==0){
                                                                                  printf("n%s %s %d",deger.yiyecek,deger.tur,deger.fiyat);
                                                                                  }
                                                                                  }
                                                                                  printf("nAna  menuye donmek icin bir tusa basiniz...");
                                                                                  getch();
                                                                                  menu();
                                                                                  } 
                                                                                  
                                                                                  void hesapla(){
                                                                                      
                                                                              
                                                                                  
                                                                                  
                                                                                  char aranan[100];
                                                                                  int t;
                                                                                  int i;
                                                                                  printf("Toplamda kac yiyecek girilecek");
                                                                                  printf("%d",&t);
                                                                                  printf("Yiyecekleri sirasiyla giriniz:");
                                                                                  for(i=0;i
    

    ancak ekleyince hep 1 öncekini siliyo ve okut deyınce ekrana yazmıo bu koddaki hataları soylersenız sevinirim.burada yemek adı turu ve fiyatı klavyeden alınıyor.istenilen ture gore yani orneğin yiyecek adını yazarak bilgilere erismek istiyosak onun adını yazıp erısıoruz .ve girdiğimiz yiyecek listesindeki fiyatların toplamını ıstersek alabılıyoruz.

  65. İsmail Tuna

    Merhabalar hocam benim sorum şu olacaktı. %d, %f gibi ifadeleri biliyorum da %3d ya da %3.2f gibi olunca ne oluyor bunu anlamadım. teşekkür ediyorum hocam. .

  66. İbrahim

    Merhabalar hocam,

    Ben bir program yazmak istiyorum.Daha önce oluşturulmuş bir dosyayı okuyacak bir kod olacak.Bu dosyadaki metinde hangi harften kaç tane olduğu bilgisini içinde barındıracak ve bize search etme imkanı verecek.Yani program çalıştırıldığında 2 veya 3 karakterlik bir metin (-ab , -dat ,se vb) girilecek ve dosyada bunun kaç defa geçtiğini döndürecek.Yardımcı olabilirmisiniz? (LinkedListlerle yapmam gerekiyor galiba)

  67. yılmaz

    hocam merhaba bir soru ihtiyacım var yapar mısınız…”c++ ta işlem yapılacak bir txt dosyasına alt altta 4 ad soy isim yazılacak öyle bir program olacak ki
    program txt dosyasındaki ismleri çağıracak ve rastgele bunlara sayı 0 dan 100 e
    kadar sayı vericek 60 ve üzeri alanları geçti diye bir txt dosyasına 60 altında alanlara
    kaldı diye bir txt dosyasına atacak bunu yapmanızı rica ediyorum.” çarşamba gününe kadar işlemi yaparsanız sevinirim…

  68. İbrahim

    İyi geceler hocam. Benim aynı bu tarzlarda bir DVD Store programına ihtiyacım var. 1 haftadan fazladır uğraşıyorum fakat hala çalışır durumda doğru dürüst bi programa sahip değilim :(. Input dosyası aşağıdaki gibi ve output dosyası boş olması gerekiyodu. Tüm güncellemelerin sonunda output dosyasına yazılacaktı. Böyle bişey bulmam ya da yapmanız mümkün müdür?

    123,25,Terminator,Action,James Cameron,Hired;
    456,15,Return of the Jedi,Fantastic,Geroge Lucas,Inv;
    100,50,Shooter,Action,Antoine Fuqua,Hired;
    210,45,The Ugly Truth,Comedy,Robert Luketic,Inv;
    857,20,Law Abiding Citizen,Crime,F. Gary Gray,Inv;
    153,35,The Terminal,Comedy,Steven Spielberg,Hired;

  69. ünal

    Hocam kitap ekleme ile ilgili bir program yazdık kodlarınızdan faydalanarak. kitap adi, yazari, isbn nosu, basım yılı değerleri doyaya işleniyor. ancak bizim yaptığımız programda gets veri aldım çünkü mesela kitap adı : “başını vermeyen şehit” üç tane kelime söz konusu bu üç kelime dosyaya yazdırabiliyorum ancak okuturken fscanf ile okuttuğumdan her boşukta bir char dizisini yani %s olayını tamamlamış oluyor. listeleme yapmak istiyorum ancak liste karışık olrak geliyor nasıl halledebilirim.teşekkür ederim iyi çalışmalar.

  70. burçin

    Hocam sizden bir yardım isteyecektim.Bu dosya yazdırma işleminde birden fazla yazılmış dosyam olsun istiyorum yani şöyleki bu yazdırma işlemini bir dögüye sokup bana sıralı dosyalar vermesini istiyorum. Örneğin dosya1,dosya2,dosya3… bu şekilde dosyan e kadar gitsin istiyorum bu konuda bana yardımcı olabilir misiniz.

  71. Şadi Evren ŞEKER Article Author

    Elbette, bahsettiğiniz dosya isimleri aslında birer dizgidir(string) ve C dilinde dizgilerin içerisine dizgi yazdırmak için sprintf fonksiyonu kullanılabilir.

    Basitçe aşağıdaki gibi bir kod yazabiliriz:

    #include 
    
    int main(){
       char dizgi[100];
       for(int i = 0 ;i<5;i++){
          sprintf(dizgi,"dosya%d.txt",i);
          printf("%sn",dizgi);
       }
    }
    

    Yukarıdaki kodun çıktısı aşağıdaki şekildedir:

    ses3:~ sadievrenseker$ ./a.out
    dosya0.txt
    dosya1.txt
    dosya2.txt
    dosya3.txt
    dosya4.txt
    
    
    Sizin durumunuzda bu dosyalar ile işlem yapacaksanız ilgili işlemi döngü içerisine yazabilirsiniz.
  72. Oguzhan

    Sadi bey merhabalar ben oguzhan bir sorum olacak. benım bir txt dosyam var asagıdaki sekilde;

    string 3 5 string
    string 6 7 string
    string 8 9 string
    ……
    ……

    boyle devam ediyor benım bu degerleri tek tek almam gerekiyor ornegın 1. satırda 1. strıngı ilk sonra 1. satırdaki 1. integer’ı sonra 1.satırdaki 2. ınteger’ı sonra 1.satırdaki 2. string’i ardından dıger satıra gecıp dosyanın sonuna kadar okumam gerekiyor bunun ıcın nasıl bir şey yapabilirim

  73. Şadi Evren ŞEKER Article Author

    Tabi yapabilirsiniz. İki basit yolu var. Birincisi değişkenleri kullanarak okuyup yazmak:

    #include 
    
    typedef struct {
       char s1[100];
       int i1;
       int i2;
       char s2[100];
    }kayit;
    
    int main(){
    kayit kayitlar[100];
    FILE *fp = fopen ("a.txt","r");
    int satir = 0;
    while(!feof(fp)){
       fscanf(fp,"%s %d %d %s",kayitlar[satir].s1,&kayitlar[satir].i1,&kayitlar[satir].i2,kayitlar[satir].s2);
       satir++;
    }
    fclose(fp);
    // yazirmak için aşağıdaki gibi birşey olabilir:
    for(int i = 0;i
    

    Diğer yöntem ise fread kullanmak. Bu sayede tek seferde recordu (struct) okuyabilirsiniz:

    #include 
    
    typedef struct {
       char s1[100];
       int i1;
       int i2;
       char s2[100];
    }kayit;
    
    int main(){
    kayit satirkayit;
    FILE *fp = fopen ("a.txt","r");
    int satir = 0;
    while(!feof(fp)){
       fread(&satirkayit,sizeof(satirkayit),1,fp);
          printf("%s %d %d %s n",satirkayit.s1,satirkayit.i1,satirkayit.i2,satirkayit.s2);
       satir++;
    }
    fclose(fp);
    }
    

    sizin sorunuza benzer olması için aşağıdaki gibi bir dosya hazırladım:

    ses3:~ sadievrenseker$ cat a.txt
    sadi 343 332 evren
    seker 342 222 bilgisayar
    kavramlari 2342 4324 .com
    ses3:~ sadievrenseker$ 
    

    Ekran çıktısı aşağıdaki şekilde

    ses3:~ sadievrenseker$ g++ dosya.cpp
    ses3:~ sadievrenseker$ ./a.out
    sadi 343 332 evren 
    seker 342 222 bilgisayar 
    kavramlari 2342 4324 .com 
    ses3:~ sadievrenseker$ 
    

  74. massa

    hocam dosyada arama yaparken örneğin bir text dosyasında “a” harfine basınca tüm a harfiyle başlayan kayıtların gelmesini veya “Ahmet” kelimesindeki “me” hecesini girdiğimizde bu heceyi barındıran tüm kayıtların ekrana gelmesini nasıl yapabiliriz?

  75. Şadi Evren ŞEKER Article Author

    Bahsettiğiniz arama, metin araması (String search) olarak geçer, ve algoritmaları ile ilgili bilgileri daha önce aşağıdaki yazılarda anlatmıştım:

    Metin arama algoritmaları (bir yazı içerisinde belirli bir dizgiyi (string) arayan algoritmalar)

  76. Emre Aksoy

    Merhaba hocam, getch() fonksiyonunu kullanmadan girilen karakteri enter girilmeden nasıl okuyabilirim ?

  77. Emre Aksoy

    getchar() fonksiyonu girilen karakterden sonra enter bekliyo yanılmıyosam,benim sorum kullanıcının girdiği karakteri kullanıcı enter girmeden alabilmekti,çözümü buldum ilginize teşekkürler.

  78. alper

    merhaba hocam,Program has received a signal-name=”SIGSEGV”,signal-meaning=”Segmentation fault” at feof({name=”__F”,value=”0x0″}) diye hata alıyorum stdio.h ın içinde acaba nerden kaynaklanıyor ??

  79. Şadi Evren ŞEKER Article Author

    Segmentation Fault, çok büyük ihtimalle pointer (gösterici) hatası olduğunu göstermekte. Sanırım kullandığınız fonksiyon feof (file end of file) yani dosya sonunu kontrol eden fonksiyon. Bu fonksiyon sadece dosya göstericisi (file pointer) aldığına göre bu dosya göstericisinin değerinin boş olması (allocate edilmemiş olması) yüksek ihtimal olarak duruyor. Ancak problemi tam anlayabilmemiz için kodunuzdan stdio.h kütüphanesindeki ilgili fonksiyonu çağıran kısmı görmemiz gerekir, sadece hatadan yola çıkarak bir tahminde bulunuyorum.

    Başarılar

  80. alper
    #include 
    #include 
    #include 
    
    typedef struct
    {
        int ogrNo,dersNo;
        char ad[50],dersAd[50];
        char soyad[50];
        int vize1,vize2,final,tut;
        float ortalama;
        char one[20],two[20],three[20],four[20],five[20],six[20],seven[20],eight[20];
    } ogrenci;
    
    
    int main(int argc, char* argv[])
    {
    
        ogrenci ogrenciler[500];
        ogrenci dersler[500];
        ogrenci notlar[500];
        ogrenci islev[500];
    
    
    
        FILE *ogrPtr=fopen(argv[1],"r");          //ders
        int satir=0;
    
        while(!feof(ogrPtr))
        {
            fscanf(ogrPtr,"%d %s %s n",&ogrenciler[satir].ogrNo,ogrenciler[satir].ad,ogrenciler[satir].soyad);
            satir++;
        }
    
    
    
    
        FILE *dersPtr=fopen(argv[2],"r");     // ders
        int satir1=0;
    
    
        while(!feof(dersPtr))
        {
            fscanf(dersPtr,"%d %s n",&dersler[satir1].dersNo,dersler[satir1].dersAd);
            satir1++;
        }
    
    
    
        FILE *notPtr=fopen(argv[3],"r");  //Notlar
        char *e;
        char Nottut[100];
        int a=0;
    
        for(a=0; a<500; a++)
            notlar[a].final=-1;
    
        a=0;
        while (e != NULL)
        {
            e=fgets(Nottut,100,notPtr);
            if (e != NULL)
            {
                sscanf(Nottut,"%d %d %d %d %d",&notlar[a].dersNo,&notlar[a].ogrNo,&notlar[a].vize1,&notlar[a].vize2,&notlar[a].final);
                if(notlar[a].final==-1)
                    notlar[a].ortalama=(float)notlar[a].vize1*40/100+(float)notlar[a].vize2*60/100;
                else
                    notlar[a].ortalama=(float)notlar[a].vize1*25/100+(float)notlar[a].vize2*25/100+(float)notlar[a].final*50/100;
    
                a++;
            }
        }
    
        FILE *comPtr=fopen(argv[4],"r");  // KOMUT
        FILE *outputPtr=fopen(argv[5],"a");
        char *c;
        char cumle1[100];
        int x=0,a1=0;
    
        while(c!=NULL)
        {
            c=fgets(cumle1,100,comPtr);
            if(c!=NULL)
            {
                sscanf(cumle1,"%s %s %s %s %s %s %s %s",islev[x].one,islev[x].two,islev[x].three,islev[x].four,islev[x].five,islev[x].six,islev[x].seven,islev[x].eight);
                x++;
            }
        }
    

    bu kodda ben breakpoint ile kontrolüm sırasında while(!feof(ogrPtr)) de sorun oluyor.Ancak codeblocs da derlediğimde program sorunsuz çalışırken mingw de sorun çıkıyor.

    Yardımlarınız için teşekkürler hocam.

  81. Şadi Evren ŞEKER Article Author

    Kodunuzda geçen argv[1] parametresi ile okuduğunuz konsol parametresini doğru olarak veriyor musunuz? Muhtemelen bu değer hatalı veya boş olduğu için hata alıyorsunuz.

    Birinci tavsiyem dosyanın doğru açıldığından emin olun. Bunun için aşağıdaki kontrolü, dosya açma satırından önce ekleyin (örneğin 28. satır olabilir):

    if(ogrPtr == NULL) {
        printf("dosya acilamadi");
        return 0;
    }
    

    ikinci tavsiyem ise verilen dosya isminin doğruluğunu kontrol edin. Örneğin 24. satıra aşağıdaki kodu ekleyebilirsiniz:

    if(ogrPtr == NULL) {
        printf("açılmaya çalışılan dosya ismi:%s",argv[1]);
    }
    

    Son olarak kodun doğru çalıştırıldığından ve konsol parametresinin verildiğinden emin olun. Örneğin 18. satıra aşağıdaki kodu ekleyebilirsiniz:

    if(argc<2){
      printf("parametre sayıları eksik, doğru çalıştırma için: "%s dosyaadi" komutunu kullanınız.",argv[0]);
    }
    

    Bu eklentileri yapıp kontrol edin, yine hata oluyorsa ekran çıktısı ile buraya yorum ekleyin ve yardımcı olmaya çalışayım ama büyük ihtimalle hatayı bu eklentilerden sonra bulup düzeltebilirsiniz.

    Başarılar

  82. alper

    Hocam dediklerinizi yaptım ve de son tavsiyenizi 18. satıra, diğerlerini 24. satıra koydum ve de Null olduğunu ve de argc<2 olduğunu gördüm ama beni 4 tane input dosyası tanıttım ve de argv[5] ile de output tanıttım.Ama dosya açılmıyor acaba düzeltmek için ne yapmam gerekiyor.Bu arada kusura bakamyın hocam ödev çalışmadığı için itiraz sürem geciktiği için bu kadar ard arda soru soruyorum.Bir de bu kodun codeblocsta çalışıp mingw de çalışmama sebebini anlamadım.

  83. Şadi Evren ŞEKER Article Author

    Problem argv değerlerini vermiyor olmanız. Kodu derledikten sonra konsoldan bu değerleri vermeniz gerekli. Hangi ortamda geliştirme yapıyorsunuz bilmiyorum ancak aşağıdaki yazıya bakın ve uygun şekilde dosya isimlerini parametre verin. Problem buradan kaynaklanıyor.

    http://www.bilgisayarkavramlari.com/2008/11/07/c-ve-komut-satiri-c-console-parameters/

    Codeblocs ortamında muhtemelen parametre tanımları doğru yapılmıştır.

    Başarılar

  84. Burak Mısırlıoğlu

    Merhaba ben okan üniversitesi bilgisayar mühendisliği son sınıf öğrencisiyim. Weka ile ilgili bitirme tezim var. İstediğim weka da SQL veritabanını nasıl açarım. Yardımlarınızı bekliyorum. Teşekkürler

  85. irfn ortky

    iyi günler hocam
    elimde hocalar.txt diye bir dosya var iceriği;
    “1”,”Metin Mısırlı”
    “2”,”Vesile Yıldız”
    “3”,”Esergül Balcı”
    “4”,”Şüheda Özben”
    “5”,”Halim Akgöl”
    “6”,”Duygu Çetingöz”
    “7”,”Yaşar Yavuz”
    “8”,”Hale Sucuoğlu”
    “9”,”Namık Öztürk”
    “10”,”Semiha Şahin”
    “11”,”İrfan Yurdabakan”
    “12”,”Ebru İkiz”
    “13”,”Mustafa Güvendi”
    “14”,”Ali Aksu”
    “15”,”Hadiye Küçükkaragöz”
    “16”,”Murat Ellez”
    “17”,”Necla Fırat”

    diye gidiyor sayılar hocaların idleri .. Hocam; idleri bir diziye ad soyadı bir diziye almak istiyorum da virgüller ve tırnaklarda ekleniyor başka bir dosyayıda bu dosya ile işlem yaptıracagımda ama virgüller ve tırnaklar engel oluyor.. hocaların id lerini ve ad soyadlarını tırnaksız ve virgülsüz dizilere alan kodları rica etsem yazabilir misiniz?

  86. irfn ortky
       FILE *fp;
       char hoca[50],sira[50];
       fp=fopen("hocalar.txt","r");
       fscanf(fp,"%s %s",sira,hoca);
       printf("%s %s",sira,hoca);
    
    } 
    

    hocam ben bu mantıkla yaptımda olmadı virgüller ve tırnaklarda hem sıraya hemde hocaya ekleniyor ama birkaç dosya ile işlem yapacagım için (küçük bir veritabanı) tırnak ve virgüllerin dizilerdeki bilgilere eklenmemesi lazım şimdiden çok teşekkür ederim

  87. Şadi Evren ŞEKER Article Author

    Çözümün iki yolu vardır. Birincisi dosyadan boşluklarla ayrılmış string(dizgi) okumak yerine karakter karakter okumaktır. Diğeri ise satır satır okuyup, okunan satır üzerinde parçalama işlemi (parsing) yapmaktır.
    Biz ikinci yolu izleyelim. Dosyadan satır okumak için fgets() fonksiyonunu kullanacağız.
    Sizin yazdığınız kodla yola başlayalım:

    FILE *fp;
    fp = fopen("hocalar.txt","r");
    char hoca[50],sira[50];
    while(!feof(fp)){
       char satir[100];
       fgets(fp,200,satir);
       printf("%s",satir);
    }
    

    Yukarıdaki eklediğimiz iki satır ile dosyayı satır satır okuyup satir isimli dizginin içerisine atıyoruz. Daha iyi anlaşılabilmesi için bir printf satırı da ekledim çalıştırırsanız dosyanın içeriğinin aynen basıldığını görebilirsiniz.
    Gelelim ikinci aşamaya, okunan satırların parçalanması ve virgüllerinden ayrılamsı. Bunun için dizgi parçalayıcısını kullanalım:

    FILE *fp;
    fp = fopen("hocalar.txt","r");
    char hoca[50],sira[50];
    while(!feof(fp)){
       char satir[100];
       fgets(fp,200,satir);
       char * pch;
       printf ("Girilen "%s" mesajini parcaliyoruz:n",str);
       pch = strtok (str," ,.-");
       // parcalama icin kullanilan ayırıcılar (delimiters)
       while (pch != NULL)
       {
         printf ("%sn",pch);
         pch = strtok (NULL, " ,.-");
       }
    }
    

    Yukarıdaki kod çalıştırılırsa, her parçanın farklı bir satırda yazıldığı görülür.

    Şimdiki adımımızda tırnak işaretlerinden kurtulmayı hedefleyelim.

    FILE *fp;
    fp = fopen("hocalar.txt","r");
    char hoca[50],sira[50];
    while(!feof(fp)){
       char satir[100];
       fgets(fp,200,satir);
       char * pch;
       printf ("Girilen "%s" mesajini parcaliyoruz:n",str);
       pch = strtok (str," ,"");
       // parcalama icin kullanilan ayırıcılar (delimiters)
       while (pch != NULL)
       { 
         printf ("%sn",pch);
         pch = strtok (NULL, " ,.-");
       }
    }
    

    Yukarıdaki kodda görüldüğü üzere, kodun 9. satırındaki parçalama işlemi değerlerini değiştirerek buraya tırnak işaretlerini de ekledik. Artık bu değerlerden de parçalanacak. Yanlız bu parçalama sonucunda boş değerler çıkacak. Bunlar atlanarak işlenebilir.

  88. irfn ortky

    merhaba hocam şu soruyu tamamladım ama mantık hatası veriyor hatayı buldum ama çözemedim yardım edebilirseniz sevinirim 🙂

    hocalar.txt;
    "1","Metin Mısırlı"
    "2","Vesile Yıldız"
    "3","Esergül Balcı"
    "4","Şüheda Özben"
    "5","Halim Aakgöl"
    "6","Duygu Çetingöz"
    "7","Yaşar Yavuz"
    "8","Hale Sucuoğlu"
    
    dersler.txt;
    "1","Eğitim Bilimine Giriş","1"
    "2","Öğrenme Öğretme Kuram ve Yaklaşımları","2"
    "3","Sınıf Yönetimi","3"
    "4","Gelişim Psikolojisi","4"
    "5","Ölçme ve Değerlendirme","5"
    "6","Program Geliştirme ve Öğretim","6"
    "7","Öğrenme Öğretme Kuram ve Yaklaşımları","2"
    "9","Gelişim Psikolojisi","4"
    

    dersler.txt te derd adlarından sonra gelenler hoca idleri benim
    yazdığım kod:

    #include 
    #include 
    #include 
    int main(){FILE *fp;
    fp = fopen("hocalar.txt","r");
    int i=1,j=1;
     char * pch[500][500];
     char b[500];
    while(!feof(fp)){
       char satir[100];
       fgets(satir,200,fp);
      
    if(!feof(fp)){
       pch[i][j] = strtok (satir,",");
       printf ("%d.satır %d.sutun : %sn",i,j,pch[i][j]);//deneme
      j++;
        pch[i][j]= strtok (NULL, ",");
      printf ("%d.satır %d.sutun : %sn",i,j,pch[i][j]);//deneme
      
        j=1;
      i++;
     
       }}
    
      
     fclose(fp);
     getch();
    FILE *fp1;
    fp1 = fopen("dersler.txt","r");
     int tt=1,t=1;
    char  *pcha[500][500];
    while(!feof(fp1)){
       char str[1000];
       fgets(str,2000,fp1);
       
    if(!feof(fp1)){
       pcha[t][tt] = strtok (str,",");
       printf ("%d.satır %d.sutun : %sn",t,tt,pcha[t][tt]);//deneme
      tt++;
        pcha[t][tt]= strtok (NULL, ",");
       printf ("%d.satır %d.sutun : %sn",t,tt,pcha[t][tt]);//deneme
       
        tt++;
         pcha[t][tt]= strtok (NULL, ",");
       printf ("%d.satır %d.sutun : %sn",t,tt,pcha[t][tt]);//deneme
       
        tt=1;
      t++;
      } 
      }
       fclose(fp1);
     getch();
      
      
    int m=1,n=1;
    while(m!=i)
    {while(n!=t)
    { if(pch[m][2]=pcha[n][3]){
                     prinf("%s %s",pch[m][1],pcha[n][2]);
    getch();
    }
                             m++;
                           n=1;
                         }
                               }    }      
    
    

    buldugum hatada ; strtok ile kestiğimizi diziye almıyor mesela printf(“%s %s”,pch[23][2],pcha[44][2]] yazdıgımda son satırda okudugu degeri yazıyor bu sorunu nasıl çözebilirim?

  89. irfn ortky

    soruyu yazmayı unutmuşum soruda dersleri ve derslere giren hocaları yazdırınız.. örnek: “eğitim bilimi giriş” dersine “metin mısırlı” giriyor..

  90. Şadi Evren ŞEKER Article Author

    Kodunuzda bazı hatalar vardı (pcha tanımlanmamış gibi) onları düzelttim ve çalışır hale getirdim. Bir de sondaki karşılaştırma döngülerinizde != yerine < = kullanmak daha doğru. Kodun son hali aşağıda, çalışma sonucunu da alıntıladım. Görüleceği üzere strtok başarılı bir şekilde çalışıyor ve metni parçalıyor: ses3:Downloads sadievrenseker$ cat deneme.c

    #include 
    #include 
    #include 
    int main(){FILE *fp;
    fp = fopen(“hocalar.txt”,”r”);
    int i=1,j=1;
     char * pch[500][500];
     char b[500];
    while(!feof(fp)){
       char satir[100];
       fgets(satir,200,fp);
     
    if(!feof(fp)){
       pch[i][j] = strtok (satir,”,”);
       printf (“%d.satır %d.sutun : %sn”,i,j,pch[i][j]);//deneme
      j++;
        pch[i][j]= strtok (NULL, “,”);
      printf (“%d.satır %d.sutun : %sn”,i,j,pch[i][j]);//deneme
     
        j=1;
      i++;
     
       }}
     
     
     fclose(fp);
    FILE *fp1;
    fp1 = fopen(“dersler.txt”,”r”);
     int tt=1,t=1;
    while(!feof(fp1)){
       char str[1000];
       fgets(str,2000,fp1);
     
    if(!feof(fp1)){
       pch[t][tt] = strtok (str,”,”);
       printf (“%d.satır %d.sutun : %sn”,t,tt,pch[t][tt]);//deneme
      tt++;
        pch[t][tt]= strtok (NULL, “,”);
       printf (“%d.satır %d.sutun : %sn”,t,tt,pch[t][tt]);//deneme
     
        tt++;
         pch[t][tt]= strtok (NULL, “,”);
       printf (“%d.satır %d.sutun : %sn”,t,tt,pch[t][tt]);//deneme
     
        tt=1;
      t++;
      } 
      }
       fclose(fp1);
     
     
    int m=1,n=1;
    while(m< =i)
    {while(n<=t)
    { 
    if(pch[m][2]=pch[n][3]){
                     printf("%s %s",pch[m][1],pch[n][2]);
    }
                             m++;
                           n++;
                         }
    n++;
                               }    }
    
    
    ses3:Downloads sadievrenseker$ g++ deneme.c
    ses3:Downloads sadievrenseker$ ./a.out
    1.satır 1.sutun : "1"
    1.satır 2.sutun : "Metin Mısırlı"
    
    2.satır 1.sutun : "2"
    2.satır 2.sutun : "Vesile Yıldız"
    
    3.satır 1.sutun : "3"
    3.satır 2.sutun : "Esergül Balcı"
    
    4.satır 1.sutun : "4"
    4.satır 2.sutun : "Şüheda Özben"
    
    5.satır 1.sutun : "5"
    5.satır 2.sutun : "Halim Aakgöl"
    
    6.satır 1.sutun : "6"
    6.satır 2.sutun : "Duygu Çetingöz"
    
    7.satır 1.sutun : "7"
    7.satır 2.sutun : "Yaşar Yavuz"
    
    8.satır 1.sutun : "8"
    8.satır 2.sutun : "Hale Sucuoğlu"
    
    1.satır 1.sutun : "1"
    1.satır 2.sutun : "Eğitim Bilimine Giriş"
    1.satır 3.sutun : "1"
    
    2.satır 1.sutun : "2"
    2.satır 2.sutun : "Öğrenme Öğretme Kuram ve Yaklaşımları"
    2.satır 3.sutun : "2"
    
    3.satır 1.sutun : "3"
    3.satır 2.sutun : "Sınıf Yönetimi"
    3.satır 3.sutun : "3"
    
    4.satır 1.sutun : "4"
    4.satır 2.sutun : "Gelişim Psikolojisi"
    4.satır 3.sutun : "4"
    
    5.satır 1.sutun : "5"
    5.satır 2.sutun : "Ölçme ve Değerlendirme"
    5.satır 3.sutun : "5"
    
    6.satır 1.sutun : "6"
    6.satır 2.sutun : "Program Geliştirme ve Öğretim"
    6.satır 3.sutun : "6"
    
    7.satır 1.sutun : "7"
    7.satır 2.sutun : "Öğrenme Öğretme Kuram ve Yaklaşımları"
    7.satır 3.sutun : "2"
    
    8.satır 1.sutun : "9"
    8.satır 2.sutun : "Gelişim Psikolojisi"
    8.satır 3.sutun : "4"
    
    "9" 
    "9" "2"
    "9" i""9" "4"
    "9" e Yaklaşımları""9" şımları""9" "2"
    "9" "4"
    ses3:Downloads sadievrenseker$ 
    
    

  91. selim

    merhaba hocam. c’de bankamatik simülasyonu projem var. bir dosyada 5 müşteriye ait şifre, ad, hesapno, bakiye bilgilerini saklayıp; programda bu bilgileri kullanarak para çekme, para yatırma, havale yapma ve çıkış seçeneklerini aktif hale getirmem gerekiyor. şöyle bir kod oluşturdum dosya işlemi için ancak bilgileri kullanamıyorum. programın devamında sonsuz döngüye giriyor.

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    
    
    int main()
    {
        FILE *fptr;
        int i; 
        int j;
        int saniye;
        long pin;
        
    void bekle(int);
        
    struct kayit{
               long sifre;
               char ad[30];
               long hesapno;
               long bakiye;
               }
               musteri[5];
               
     fptr=fopen("veritabani.txt", "r+");
     if(fptr==NULL)
     {printf("n dosya açılamadı");
     exit(1);
     
    int n = 0; 
    while(!feof(fptr)) { 
    
            fscanf( fptr,"Sifre: %4.dn", &musteri[i].sifre  );
    		fscanf( fptr,"Ad: %15.sn", &musteri[i].ad );
    		fscanf( fptr, "Hesap Numarasi: %6.dn", &musteri[i].hesapno );
            fscanf( fptr, "Bakiye: %5.dn", &musteri[i].bakiye );
          
    ++n; 
    } 
          
            fscanf( fptr,"Sifre: %4.dn", &musteri[i].sifre  );
    		fscanf( fptr,"Ad: %15.sn", &musteri[i].ad );
    		fscanf( fptr, "Hesap Numarasi: %6.dn", &musteri[i].hesapno );
            fscanf( fptr, "Bakiye: %5.dn", &musteri[i].bakiye );
          
           
        
            
    fclose(fptr);  /* Dosyayı kapat. */
    
    
       }
    
  92. Şadi Evren ŞEKER Article Author

    konuzdaki fscanf fonksiyonlarının içerisine sadece okunacak olan değerleri koyun.

    fscanf(fptr, “%s”, musteri[i].ad);

    şeklinde ve ayrıca string okunurken değişkeninb aşında & işareti bulunmaz.

    Son olarak dosyanın bulunamama durumundaki if kontrolünde exit(1) blok parantezinin içerisinde olmalı. Kısacası blok parantezlerinizi tekrar kontrol edin.

    Başarılar

    1. selim

      hocam öncelikle teşekkürler. 5 müşterinin bilgilerinin yer aldığı dosyada şifre sorgulamayı ve doğruysa şu menünün açılmasını nasıl sağlarız peki?
      “1)para çekme
      2)para yatırma
      3)havale
      4)çıkış”

      dosyadaki şifreyi döngüye sokamıyorum ben.

  93. UĞUR CAN

    Merhaba.. C dilinde telefon rehberi uygulaması veya sözlük uygulaması yapmam gerekiyor.. Fakat arama motoru mantıgıyla yapmam gerekiyo.. yani “a” ya bastıgımda a ile başlayan isimleri bana listeleyen bi program.. Yardımcı olabilirmisiniz?

  94. bilgisay

    Tam olarak hangi kütüphane? Sanırım yorumda <> gibi işaretler kullandınız onlar çıkmamış. Problem çok büyük ihtimalle kurulumdan kaynaklanır. Kurulum ortamınız hakkında (derleyici işletim sistemi vs. ) bilgi verirseniz yardımcı olmaya çalışayım.

    Başarılar

  95. ece

    hocam merhaba,benim c de arama motoru yapma ile ilgili bir proje ödevim var,20 tane txt dosya oluşturudum bunları 1 klasöre kaydettim.daha sonra main yapısı içerisinde bu dosyaları teker teker açıp,aradığım kelime ile karşılaştırark search yapmaya çalışıyorum ama kalsör içerisinde nasıl kelime arayaağımı bulamıyorum.
    programın çıktı ankara kelimesii şehir dosyası içerisinde 20.satırda bulundu şeklinde olmalı teşekkür ederim

  96. Şadi Evren ŞEKER

    Merhaba Ece Hanım,

    Aslında projenizin zaten yapılmış hali var. Linux veya Unix işletim sistemlerindeki grep komutu tam da bu işe yarar ve C dilinde exec ailesi fonksiyonları ile komut satırından bunu çağırabilirsiniz. Ancak size ödev/proje olarak veirlmesinden anlaşılacağı üzere bu komutun çalışmasını da sizin yazmanız istenmiş. Bu durumda dosyaları teker teker açıp fread veya fscanf benzeri bir fonksiyon ile bir string (dizgi) (C’de string olmadığı için karakter dizisi) içerisine okutup sonra bu değişkenin içerisinde kelimeyi aratmanız en mantıklı yol. Bunun için yine C dilinde olan string.h kütüphanesindeki strcmp fonksiyonundan faydalanabilirsiniz.

    http://bilgisayarkavramlari.sadievrenseker.com/2008/12/27/dizgi-karsilastirma-string-comparison/

    Başarılar

  97. Faruk Yılmaz

    Hocam merhabalar
    Elimde bir txt dosyası var,dosya şu şekilde
    7
    1 12 31 93 44 55 98
    ilk satır ikinci satırda kaç tane integer olacağını söylüyor,
    amacım ikinci satırdaki integerları bir arraya atmak
    A[1,12,31,93,44,55,98] şeklinde
    fakat bir türlü başaramadım,yardımcı olabilirseniz çok sevinirim

  98. Şadi Evren ŞEKER

    Faruk Bey,

    Dosyayı açıp ilk satırı okuyun :

    FILE *fp  = fopen ("dosya.txt");
    int elemanSayisi = fscanf(fp,"%d",&elemanSayisi);
    

    Diziyi dinamik tanımlamanız gerekiyor. Bunun için aşağıdakine benzer bir yol izleyebilirsiniz:

    int *dizi = (int *)malloc(sizeof(int)*elemanSayisi);
    

    Ardından her eleman için dosyadan bir okuma yapıp dizinin sırasdaki hafıza alanına atama işlemi yapmanız gerekiyor:

    for(int i =0;i<elemanSayisi;i++)
      fscanf(fp,"%d",&dizi[i]);
    
  99. Ayşe

    Merhabalar,C de dosyadan matris okumayı nasıl yapabiliriz?matrisin boyutları bilinmiyor satır ve sütun sayısını hesaplatabildim ama bi türlü dosyadan matrisi okutamadım,yardımcı olursanız sevinirim.Dosyadaki matrisin görünümü
    0011011011
    1000011011
    0010011101
    1011011111
    1010001101
    1110101101
    1011100111
    1110110111
    1101110011
    1101011011
    gibi olucak.

  100. Şadi Evren ŞEKER

    matrisin okunması ile sanırım dosyadaki sayıları diziye okumayı kast ediyorsunuz. Örnek matrisinizdeki sayılar çok yüksek olduğu için dizgi (String) kullanmanız gerekir. Yani öncelikle her satırı birer dizgiye okuyacaksınız. Bunun için fscanf fonksiyonunu %s ile kullanabilirsiniz veya fgets gibi fonksiyonları kullanabilirsiniz. Ardından okunan dizgideki her karakteri integer’a çevirmeniz gerekiyor (dizinin integer dizisi olduğunu kabul ediyorum). Bunun için de atoi fonksiyonunu kullanabilirsiniz.
    Elbette bu yukarıdaki işlemleri iç içe (nested) iki döngü ile yapmanız gerekiyor (bir döngü satır için diğer döngü ise her satırdaki her karakter için).

  101. zehra

    ben bir soru sormak istiyorum. benim elimde bir dosya var. bu dosyada 100 tane öğrencinin isimleri ve 5 tane sınav notu var. ben bu isim ve notları diziye aktarmak istiyorum ve sonrasında da hangi öğrenci hangi nota sahip bulmak istiyorum. yani max notu bulmak isteyince ismiyle bulmak istiyorum. nasıl yapabilirim?

  102. Burak

    hocam elinize sağlık , güzel çalısma olmus , cok işime yaradı . ( linkteki programda sıkıntı var yalnız sadece bende mi var ? )

  103. Ertugrul

    merhaba bir ödevim var yardım edebilirmisiniz
    şimdi .txt uzantılı bir dosya var ve dosyadaki herhangi bir kelimeyi bulup o kelimeyi büyük harfelerle tekrar aynı dosyaya o kelimenin yerine yazdırmam gerekiyo nasıl yapabilirim yardım edin

  104. Abdül Gani
    // C'de dosya içerisine Kayıt ve dosya içerisinde Arama yapan C programı
    #include
    #include
    #include
    #include
    #include
    
    
    FILE*f;
    struct vatandas
    {
    	char ad[15],soyad[20];
    	char bb[15],an[15];
    	char mem[25];
    	int dta[25];
    	char no[13],tno[10];
    } vat;
    
    int i,sec,kaysay;
    char noara[13];
    
    void giris(void)
    {
    	
        FILE*f;
        f=fopen("gani.txt","w+b");
        if(ferror(f)!=0) printf("Dosya açılamadı");
        else
        {
        	
    	    system("CLS");
    		printf("\nYeni Vatandaslik No :");
    		scanf("%s",vat.no);
    			printf("\nDogum Tarihi :"); 
    			scanf("%s",vat.dta);
    				printf("\nVatandasin Adi :"); 
    				scanf("%s",vat.ad);
    					printf("\nVatandasin Soyadı :"); 
    					scanf("%s",vat.soyad);
    						printf("\nBaba Adi :"); 
    						scanf("%s",vat.bb);
    					printf("\nAnne Adi :"); 
    					scanf("%s",vat.an);
    				printf("\nTelefon No :"); 
    				scanf("%s",vat.tno);
    			printf("\nMemleketi :"); 
    			scanf("%s",vat.mem);
    	
    	    fseek(f,filelength(fileno(f)),SEEK_END);
    	    fwrite(&vat,sizeof(vat),1,f);
    	    fflush(f);
    	    printf("\ndevam etmek için bir tusa basiniz");
    	    getch();
        }
    }
    	
    int arama(void)
    {
    	
    	system("CLS");
        printf("Aranacak Vatandaslik Numarasini Giriniz:");
        scanf("%s",&noara);
        kaysay=filelength(fileno(f))/sizeof(vat);
        for(i=0;i
    

    merhaba hocam bu programda hata göstermiyor fakat 2. işlem secimi yapıldıgında kayıtlı vatadaslık numarasını yazdıgımız halde dosya içindeki kaydı bulamadı diyor. Yardımcı olursanız sevinirim.

    1. Şadi Evren ŞEKER

      Yerinizde olsam fseek ve fread yerine fscanf kullanırdım. Basitçe her kaydı okuyup no kısmını karşılaştırmanız yeterli olur. Zaten benzer bir örnek yukarıdaki yazıda bulunan kodda verilmiş durumda.

  105. davut

    hocam ben açtığım bir txt dosyasının içerisine otobiyografimi yazmak istiyorum ne yaptıysam beceremedim yardımcı olur musunuz bana

    1. Şadi Evren ŞEKER

      Davut Bey, ciddi misiniz, trollüyor musunuz anlayamadım, yorumunuzu onaylarken bir iki kere gittim geldim 🙂 ama sonuçta iyi niyet esastır diyerek onayladım. Tam olarak nasıl birşey istediğinizi açıklarsanız yardımcı olmaya çalışalım. Mesela dert sadece txt dosyasına yazdırmaksa windowstaki notepad veya wordpad gibi bir uygulama ile açıp gönlünüzden ne geçiyorsa yazabilirsiniz. Yok C dilinde yazdırıcam diyorsanız (yorumu bu konu altında yapmışsınız) o zaman C ile yukarıdaki örneklerde defalarca anlatılan şekilde yazdırmayı deneyin. Ha bilgisayar benim otobiyografimi kendisi anlasın kendisi yazdırsın diyorsanız henüz sizin otobiyografinizi otomatik yazdıracak bilgisayar çıkmadı 🙂

      Ama dediğim gibi daha detaylı sorarsanız yardımcı olmaya çalışayım (Tabi iyi niyetliyseniz)

  106. davut

    kesinlikle kötü bir niyetim yok hocam yanlış anlamayın bu dili hiç bilmediğimden soruyorum 🙂 hocam şimdi 2 .txt dosyası açılacak. ve çalışma ekranına “otobiyografinizi giriniz=” yazısı altına ben otobiyografimi yazdığım zaman 1. dosyaya kaydedecek ardından otobiyografi içerisinde bulunan herhangi bir kelimeyi alıp onun yerine başka bir kelime yazdırılacak ( örn. ayşe yi fatma yap). ve yazdığım otobiyografi 2. txt dosyasının içerisine tersten kaydedilecek. Ben yine anlatamadım galiba derdimi 🙂

    1. Şadi Evren ŞEKER

      Şöyle yapın, bir döngü içerisinde gets() fonksiyonu ile okuyun girilen satırları, fprintf ile de dosyaya yazdırın. Benzer örnekler yukarıda da var. Şu yazı da faydalı olabilir:

      http://bilgisayarkavramlari.sadievrenseker.com/2012/05/31/printf-sprintf-fprintf/

      Ve şu yazılar da :
      http://bilgisayarkavramlari.sadievrenseker.com/2008/08/02/dizgi-string/
      http://bilgisayarkavramlari.sadievrenseker.com/2010/01/13/c-ile-programlamaya-giris-quiz-sorulari-ve-cozumleri/

  107. Yagmur

    C++ ta isim soyisim ve numara tutan bir txt dosyası olusturuyorum listeleme kayıt ve aramayı yaptım fakat düzenleme ve silme kısmını yapamadım banada yardımcı olur musunuz hocam 🙁

    kodlarımıda gösteriyim

    void duzenleme()
    {
    int numara;
    int no;
    char isim[80];
    char soyisim[80];
    ifstream DosyaOku;
    DosyaOku.open(“Kisi.txt”, ios::app);
    cout <> no;
    if (no==numara)
    {
    // DosyaOku.close;

    ofstream DosyaYaz;
    DosyaYaz.open(“Kisi.txt, ios::app”);
    cout <> isim;
    cout <> soyisim;
    cout <> numara;

    // DosyaYaz.close;
    }
    else
    cout << "Kisi bulanamadi..";
    }

    void silme()
    {
    int numara;
    int no;
    char isim[80];
    char soyisim[80];

    cout<<"silinecek numarayi giriniz : "<>numara;
    ifstream DosyaOku;
    DosyaOku.open(“Kisi.txt”,ios::in | ios::binary | ios:: out);
    ofstream gecici;
    gecici.open(“gecici.txt”,ios::out);
    while(DosyaOku>>isim>>soyisim>>numara)
    {
    if(numara==no)
    {
    remove(“Kisi.txt”);
    gecici << isim <<soyisim << numara;
    }
    }

    bu Şekilde silme kısmında veriyi okutmayıp silinmiş gibi göstermem lazım veri kaybını önlemek için ne yapmam gerekir..?

  108. ada

    Hocam Merhaba benim elimde yaklaşık 8000 adet sayı bulunan bir dosya var ve ben bu dosyadan 150 nin üzerinde tekrar eden sayıları silmek istiyorum şöyleki 200 sayısından 220 tane olduğunu düşünelim 150 tanesi kalsın70 tanesi silinsin
    Ben bu 8000 adet sayıdan kaçar tane olduğunu bulan ve bu sayıları sıralayan programı elde ettim fakat silme işlemini yapamadım Kodu koyuyorum yardım ederseniz sevinirim (hata 150 tane bırakan kadar silip daha sonra random ile 150 ye kadar olan sayılardan birini atayan program yapmak istedim ama çok zor olur diye vazgeçtim )

    #include
    #include
    #include
    #include
    #define SIZE 8000
    void sirala(double dizi[],int dizi1[],int size);
    void quickSort(double A[],int dizi[],int p, int r);
    int partition(double A[],int dizi[],int p, int r);
    int main()
    {
    FILE *fptr1,*fptr2;
    double d,dizi[SIZE];
    int i,j,k,intdizi[SIZE],kontrol,temp;
    fptr1=fopen("a.txt","r");//okunacak dosya
    fptr2=fopen("b.txt","w");
    for(i=0;i0)
    {

    d=round(d);
    fprintf(fptr2,"%.2f\n",d);
    kontrol=0;
    for(j=0;j<i;j++)
    {
    if(ddizi[j]-0.0001)
    {
    kontrol=1;
    temp=j;
    break;
    }
    }
    if(kontrol==0)
    {

    dizi[i]=d;

    ++intdizi[i];
    i++;
    }
    else
    {
    ++intdizi[temp];
    }

    }
    //sirala(dizi,intdizi,i);
    quickSort(dizi,intdizi,0,i);
    for(k=0;k<i;k++)
    {

    printf("%.2f den %d adet bulunmakta\n",dizi[k],intdizi[k]);

    printf("%.2f den %d adet bulunmakta\n",dizi[k],intdizi[k]);
    }
    printf("\n\n %d adet farkli sayi bulunmakta\n",i);
    return 0;

    }

    void quickSort(double A[],int dizi[],int p, int r)
    {
    int q;
    if(p<r)
    {
    q=partition(A,dizi,p, r);
    quickSort(A,dizi,p, q-1);
    quickSort(A,dizi,q+1, r);
    }
    }
    int partition(double A[],int dizi[],int p, int r)
    {
    double tmp;
    double x = A[r];
    int i = p-1,tmp1;

    for(int j=p; j<=r-1; j++)
    {
    if(A[j]<=x)
    {
    i++;
    tmp=A[i];
    A[i]=A[j];
    A[j]=tmp;

    tmp1=dizi[i];
    dizi[i]=dizi[j];
    dizi[j]=tmp1;
    }
    }
    tmp=A[i+1];
    A[i+1]=A[r];
    A[r]=tmp;

    tmp1=dizi[i+1];
    dizi[i+1]=dizi[r];
    dizi[r]=tmp1;

    return i+1;
    }

  109. ada

    Hocam kodumu biraz düzelttim şimdi istediğim silme işlemini yapıyor ama max 50 ye kadar yapıyor Max=3 olunca patlıyor

    #include
    #include
    #include
    #include

    #define SIZE 8000
    #define MAKS 3
    #define MYSTOP 10000.000000

    void readFile(float *, FILE *);
    void addArray(float *, float *);
    int control(float *, float, int);
    void writeFile(float *, FILE *);

    int s_array_len = 0;

    int main(){
    FILE *s_file, *t_file;
    float s_array[SIZE], t_array[SIZE];

    s_file = fopen("uzunmetin.txt", "r");
    t_file = fopen("uzunmetin2.txt", "w");

    readFile(s_array, s_file);
    addArray(s_array, t_array);
    writeFile(t_array, t_file);

    fclose(s_file);
    fclose(t_file);

    return 0;
    }

    void readFile(float *s_array, FILE *s_file){
    float tmp;

    while( fscanf(s_file, "%f", &tmp) > 0 ){
    s_array[s_array_len] = tmp;
    ++s_array_len;
    }
    }
    void addArray(float *s_array, float *t_array){
    int tmp_s = 0, tmp_t = 0;
    for(tmp_s = 0; tmp_s < s_array_len; tmp_s++){
    if( control(t_array, s_array[tmp_s], tmp_t) ){
    t_array[tmp_t] = s_array[tmp_s];
    ++tmp_t;
    }
    }
    t_array[tmp_t] = MYSTOP - 0.000001;
    }
    int control(float *t_array, float myData, int tmp){
    int i = 0, result = 0;
    for(i = 0; i <= tmp; i++)
    if(t_array[i] == myData)
    result++;

    if( result < MAKS )
    return 1;
    else
    return 0;
    }
    void writeFile(float *t_array, FILE *t_file){
    int i = 0;
    for(i = 0; t_array[i] != MYSTOP; i++){
    fprintf(t_file, "%f\n", t_array[i]);
    }
    }

  110. adem

    Hocam burda en yük alan notu gösteriyorum ama En yüksek notu alan ogrencinin adını yazdıramıyorum. yardım lütfen…

    #include
    struct ogrenci{
    int not;
    char ad[20];
    };
    int main()
    {
    int buyuk=0;
    struct ogrenci kayitOku={0,””};
    FILE *dosya;
    if((dosya=fopen(“deneme.txt”,”r”))==NULL)
    printf(“dosya bulunamadi”);
    else
    {
    printf(“No\tAd\n”);

    while(!feof(dosya))
    {
    fread(&kayitOku,sizeof(struct ogrenci),1,dosya);
    if(buyuk<kayitOku.numara)
    buyuk=kayitOku.numara;
    }
    }
    fclose(dosya);
    }

  111. BAYRAM CAN

    merhaba hocam bi konuda yardımınızı istiycem ‘bir metin ile dolu dosyayı tersten başka bir dosyaya yazdıran cprogramı’ bunu yazarken bana yardımcı olabilirmisiniz? şimdiden teşekkür ederim

  112. Burak

    hocam merhaba benim bir odevim var c de grafik.h kullanarak basit bir paint programmı yapmak programı yaptım lakin yaptıgım programin olusrdugum paint bolumunde resmi kaydetmem gerekiyor yani dosylama işlemi gerekli lakin png dosyasını c de nasıl kaydedebilrim yapamamıyorum ,yardımcı olursanız sevinirim

  113. hamdiye

    hocam şimdi elimde iki tane dosya var ama yapılacak işlem ikisi içinde aynı kullanıcı hangi dosyayı açarsa onun üzerinden çalışan bir program ama dosyayı kullanıcı gireceği için o dosyayı nasıl açacağımı bilmiyorum yardm ederseniz sevinirim

  114. Hikari

    Sizde olmasanız adam akıllı programlama öğrenemeyeceğiz hocam. Derslerde hocalar anlatıp çıkıyor. İnternette eskiye göre kaynak çok kabul ama çoğu slayt şeklinde. Ne mantığını kavrayabiliyoruz ne bi şey kuru bilgi gibi geliyor insan bölümden sıkılıyor. Sayenizde bilgisayar programlama mantığını kavrıyorum ve bir şeyler yapabilirim hissine kapılıyorum. Bu kulvarda ingilizce çok iyi kaynak var ama bizim deyimimizle ingilizcem yetmiyor algılamaya . Hayatınızda her zaman istedikleriniz olur umarım hocam. Videolarınızı ve yazılarınızı takip edeceğim.

irfn ortky için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir