Şimdi Ara

C programlama dosyadan struct ile veri okuma

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
13
Cevap
0
Favori
4.759
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • C proje ödevimde öğrenci not giriş sistemi yapmam gerekiyor, not görüntüleme kısmında bir sorunla karşılaştım;

    Dosyadan struct ile veri okumak istiyorum fakat çalışmayı durdurdu hatası veriyor kodları denedim fscanf bölümünde sıkıntı var, dosyadan struct kullanarak nasıl veri okuyabilirim?




    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    struct ogrenci{
    int no;
    char *ad;
    int vize;
    int final;
    };
    int main(){

    FILE *dg = fopen("ogrenci.txt","r");

    struct ogrenci a;
    while (!feof(dg))
    {

    fscanf(dg,"%d %s %d %d",&a.no,a.ad,&a.vize,&a.final);
    printf("%d %s %d %d",a.no,a.ad,a.vize,a.final);

    }

    return 0;
    }


    ek olarak;
    Bir sonraki bölümde öğrencilerin notlarını girme/değiştirme işlemi yapmam gerekiyor. Aklımda dosyadan verileri alıp, matris diziye atayarak dizi üzerinde işlem yapıp, dosyayı sıfırladıktan sonra dosyaya yazdırma işlemi var. Yapmayı düşündüğüm bu işlemin dizi kullanmadan, dosya silip yeniden yazmadan daha kolay bir yöntemi vardır diye düşünüyorum.

    Dosya işlemleri hakkında pek bilgi sahibi değilim internette fazla türkçe kaynak bulamadım, bulduğum kadarıyla bir şeyler yapmaya çalışıyorum.



    Sorunu çözdüm, struct kısmındaki ad değişkenini pointer olarak değil dizi olarak aldım şimdi sorunsuz alıyor verileri.

    quote:

    struct ogrenci{
    int no;
    char ad[20];
    int vize;
    int final;
    };



    < Bu mesaj bu kişi tarafından değiştirildi Entelektüel Ayı -- 21 Nisan 2017; 16:34:38 >







  • up
  • hocam bide malloc kullanıp denermisiniz acaba
    ad = (char *)malloc(sizeof(char)*20); kendi bilgisayarımda çalıştı
  • hocam okuma işini halettim ad değişkenini dizi olarak aldım, malloc ile alınca da oldu sağolun.

    struct ile dosyadan no isim vize final bilgilerini çekip değişiklik yapmam lazım onu yapamadım,

    örnek olarak 1002 nolu öğrencinin vize notunu değiştireceğim nasıl yapabilirim?
    1001 sedat_atli 30 50
    1002 meltem_ak 25 85
    1003 selim_isik 10 60
    1004 selin_gur 100 50
  • Entelektüel Ayı kullanıcısına yanıt
    Hocam bende buna benzer bir örneği hepsini diziye atıp üstünde değişiklik yaparak yapmıştım daha basit yolu varmıdır bilmiyorum.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Ben de diziye atayarak yapmayı düşündüm ama beceremedim. Örnek kod varsa atabilir misiniz?
  • quote:

    Orijinalden alıntı: Entelektüel Ayı

    Ben de diziye atayarak yapmayı düşündüm ama beceremedim. Örnek kod varsa atabilir misiniz?

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    FILE *dosya,*dosya2;
    main()
    {
    char numara[20][20],ad[20][20],aranacak[20];
    int vize[20],final[20];
    dosya=fopen("ogrenci.txt","r");
    dosya2=fopen("ogrencidegistirilen.txt","w");
    printf("Ogrenci numarasi :");
    gets(aranacak);
    for(int i=0;!feof(dosya);i++)
    {
    fscanf(dosya,"%s %s %d %d",numara[i],ad[i],&vize[i],&final[i]);

    if(strcmp(numara[i],aranacak)==0)
    {
    printf("Yeni vize notu =");
    scanf("%d",&vize[i]);
    printf("Yeni final notu =");
    scanf("%d",&final[i]);
    }
    fprintf(dosya2,"%s %s %d %d",numara[i],ad[i],vize[i],final[i]);
    }
    fclose(dosya);
    fclose(dosya2);
    getch();
    return 0;
    }



    buyrun hocam kendi kodunuza bu mantığı oturtabilirsiniz.sizde yeni bir dosya yerine başka bir döngüde dosyanın üstüne yazabilirsiniz.



    bu arada başka yöntem varsa burada ki iki kişide o yöntemi bekliyoruz . bence bu doğru olan değil hataya çok elverişli.



    < Bu mesaj bu kişi tarafından değiştirildi SekreterAdam -- 22 Nisan 2017; 22:0:33 >




  • quote:

    Orijinalden alıntı: SekreterAdam

    quote:

    Orijinalden alıntı: Entelektüel Ayı

    Ben de diziye atayarak yapmayı düşündüm ama beceremedim. Örnek kod varsa atabilir misiniz?

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    FILE *dosya,*dosya2;
    main()
    {
    char numara[20][20],ad[20][20],aranacak[20];
    int vize[20],final[20];
    dosya=fopen("ogrenci.txt","r");
    dosya2=fopen("ogrencidegistirilen.txt","w");
    printf("Ogrenci numarasi :");
    gets(aranacak);
    for(int i=0;!feof(dosya);i++)
    {
    fscanf(dosya,"%s %s %d %d",numara[i],ad[i],&vize[i],&final[i]);

    if(strcmp(numara[i],aranacak)==0)
    {
    printf("Yeni vize notu =");
    scanf("%d",&vize[i]);
    printf("Yeni final notu =");
    scanf("%d",&final[i]);
    }
    fprintf(dosya2,"%s %s %d %d",numara[i],ad[i],vize[i],final[i]);
    }
    fclose(dosya);
    fclose(dosya2);
    getch();
    return 0;
    }



    buyrun hocam kendi kodunuza bu mantığı oturtabilirsiniz.sizde yeni bir dosya yerine başka bir döngüde dosyanın üstüne yazabilirsiniz.



    bu arada başka yöntem varsa burada ki iki kişide o yöntemi bekliyoruz . bence bu doğru olan değil hataya çok elverişli.

    Alıntıları Göster

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    FILE *dosya;
    main()
    {
    char numara[20][20],ad[20][20],aranacak[20];
    int vize[20],final[20];
    int i;
    dosya=fopen("ogrenci.txt","r");
    printf("Ogrenci numarasi :");
    gets(aranacak);
    for(i=0;!feof(dosya);i++)
    {
    fscanf(dosya,"%s %s %d %d",numara[i],ad[i],&vize[i],&final[i]);

    if(strcmp(numara[i],aranacak)==0)
    {
    printf("Yeni vize notu =");
    scanf("%d",&vize[i]);
    printf("Yeni final notu =");
    scanf("%d",&final[i]);
    }
    }
    fclose(dosya);
    dosya=fopen("ogrenci.txt","w");
    for(i=0;i<10;i++)
    {
    fprintf(dosya,"%s %s %d %d
    ",numara[i],ad[i],vize[i],final[i]);
    }
    fclose(dosya);
    getch();
    return 0;
    }


    hocam kodu biraz değiştirdim aynı dosya üzerinde işlem yapabiliyoruz böylece daha kullanışlı oldu ama dediğiniz gibi dizi değil de başka bir yönetimi olmalı bu işin bilen biri bize bir yol gösterse fena olmaz



    < Bu mesaj bu kişi tarafından değiştirildi Entelektüel Ayı -- 23 Nisan 2017; 2:24:14 >




  • Entelektüel Ayı kullanıcısına yanıt
    Hocam aynı dosyayı aynı anda hem okuyup hemde yazmak mümkün mü ? R modunda açmışsınız gördüğüm kadarıyla.

    < Bu ileti mobil sürüm kullanılarak atıldı >

  • typedef struct {
    char ad[20];
    int no;
    int vize;
    int final;
    } Ogrenci;


    Elimizde hazır obje var, bunu çoğaltmamız lazım içindeki elemanları değil. Kaç tane öğrenci istiyorsun 50 tane diyelim.

    Ogrenci ogrenci[50]; // Bu kadar

    Önce hepsini oku...


    for(i=0; !feof(dosya); ++i) {
    fscanf(dosya,"%s %d %d %d", ogrenci[i].ad, &ogrenci[i].no, &ogrenci[i].vize, &ogrenci[i].final);

    // değişiklikleri yap
    }


    Sonra dosyayı kapat, yeni dosya aç ve içeriğini yazdır. Yeni dosyayı "w+" ile açacaksın, böylece aynı isimli dosyanın üzerine yazacak.

    Aynı dosya üzerinde hem okuyup hem yazmak çok zahmetli. Dosya işaretçisini sürekli ileri geri sarıp okuduğun byte kadar yazman gerekiyor. 1 eksik ya da 1 fazla olursa hatalı veri alırsın.



    < Bu mesaj bu kişi tarafından değiştirildi Guest-BF8E9B238 -- 23 Nisan 2017; 10:32:46 >
  • quote:

    Orijinalden alıntı: Mühendisc

    Hocam aynı dosyayı aynı anda hem okuyup hemde yazmak mümkün mü ? R modunda açmışsınız gördüğüm kadarıyla.

    Yok hocam diziye aldıktan sonra dosyayı kapatıp w modunda açtım.
  • Entelektüel Ayı kullanıcısına yanıt
    Şimdi gördüm hocam kusura bakmayın koda sabah baktığım için görememişim demekki.
  • kusura bakmayın hocam programla uğraşırken mesajınızı görüp cevap yazmayı unutmuşum.

    hocam kaç öğrenci ekleyeceğimiz önceden belli değil, program;


    • öğrenci ekleme
    • öğrenci silme
    • not girişi
    • not görüntüleme


      olarak bölümler halinde.
      Böyle olunca da dizi eleman sayısı belli olmuyor, aslında not giriş bölümünde dosyadan satır sayısını alıp öğrenci sayısını buluyoruz fakat derleyici dizi sayısını sonradan veya önceden belirlenmesine izin vermiyor,
      mesela

      a=10;
      dizi [a]; mesela böyle bir kullanımı kabul etmiyor fakat

      #define a 10
      dizi [a]; bu kullanımı kabul ediyor.

      struct ile veri okuma işini hallettim bu arada, ilk mesaja eklemiştim.



    < Bu mesaj bu kişi tarafından değiştirildi Entelektüel Ayı -- 6 Mayıs 2017; 17:26:5 >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.