Şimdi Ara

Şu kodun işlevini anlayamadım bir türlü

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
6
Cevap
0
Favori
317
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj

  • Arkadaşlar internetten aşağıdaki gibi bir kod buldu kodda anlamadıgım yerler var.

    1- #define YapiBoyutu sizeof(struct kayitYapisi) Burada neden yapının boyutunu almış.Programda ne işe yarıyor.

    2- fseek(dosya,i*YapiBoyutu,SEEK_SET); Bide bu kodların programdaki işlevini anlamadım.
    fwrite(&insan,YapiBoyutu,1,dosya);
    fread(&insan,YapiBoyutu,1,dosya);





    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <ctype.h>
    #include <string.h>


    #define YapiBoyutu sizeof(struct kayitYapisi)

    struct kayitYapisi{
    char isim[30];
    char soyisim[40];
    char numara[15];
    char doluMu;
    };

    char anaMenu(void);
    void kayitEkle(FILE*);
    void kayitSil(FILE*);
    void kayitListele(FILE*);


    int main()
    {
    FILE *dosya;
    int i;
    struct kayitYapisi insan={"","","",'H'};
    char karar;

    if((dosya=fopen("dosyam.txt","r+"))==NULL)
    {
    dosya=fopen("dosyam.txt","w+");
    fclose(dosya);
    dosya=fopen("dosyam.txt","r+");
    printf("DOSYA OLUSTURULDU"); getch();
    for(i=0;i<30;i++)
    {
    fseek(dosya,i*YapiBoyutu,SEEK_SET);
    fwrite(&insan,YapiBoyutu,1,dosya);
    }
    }


    while(1==1)
    {
    karar=anaMenu();

    switch (karar)
    {
    case '1': kayitEkle(dosya); break;
    case '2': kayitListele(dosya); break;
    case '3': kayitSil(dosya); break;
    case '4': fclose(dosya); return;
    }
    }
    }

    void kayitEkle(FILE *dosya)
    {
    int i;
    struct kayitYapisi insan;



    for(i=0;i<30;i++)
    {
    fseek(dosya,i*YapiBoyutu,SEEK_SET);
    fread(&insan,YapiBoyutu,1,dosya);

    if(insan.doluMu=='H')
    {
    printf("\n\tIsim Giriniz: ");
    scanf("%s",&insan.isim);

    printf("\n\tSoyisim Giriniz: ");
    scanf("%s",&insan.soyisim);

    printf("\n\tNumara Giriniz: ");
    scanf("%s",&insan.numara);

    insan.doluMu='E';

    fseek(dosya,i*YapiBoyutu,SEEK_SET);
    fwrite(&insan,YapiBoyutu,1,dosya);
    printf("\n\n\tKayit Eklendi...");

    getch();
    return;
    }
    }
    }

    void kayitSil(FILE *dosya)
    {
    char tus,eminMi;
    int i;
    char isim[20];
    char numara[15];
    int silinecek=-1;
    struct kayitYapisi insan={"","","",'H'};

    printf("\n\t(1) Isme gore sil");
    printf("\n\t(2) Numaraya gore sil");

    do{
    tus=getch();
    }while(tus!='1'&&tus!='2');

    switch (tus)
    {
    case '1': printf("\n\tSilmek istediginiz kisinin ismini giriniz :");
    scanf("%s",&isim);
    break;
    case '2': printf("\n\tSilmek istediginiz kisinin numarasini giriniz :");
    scanf("%s",&numara);
    break;
    }

    for(i=0;i<30;i++)
    {
    silinecek=-1;

    fseek(dosya,i*YapiBoyutu,SEEK_SET);
    fread(&insan,YapiBoyutu,1,dosya);

    if(insan.doluMu=='E')
    {
    if(tus=='1'&&strcmp(isim,insan.isim)==0) //isme göre aranıyor ise
    silinecek=i;

    else if(tus=='2'&&strcmp(numara,insan.numara)==0)
    silinecek=i;
    }

    if(silinecek!=-1)
    {
    printf("\n\tIsim: %s\n\tSoyisim: %s\n\tNumara: %s",insan.isim,insan.soyisim,insan.numara);
    printf("\n\n\t\tBu kayidi silmek istediginize emin misiniz ? (E / H)");
    do{
    eminMi=getch();
    eminMi=toupper(eminMi);
    }while(eminMi!='E'&&eminMi!='H');

    if (eminMi=='E')
    {
    insan.doluMu='H';
    fseek(dosya,i*YapiBoyutu,SEEK_SET);
    fwrite(&insan,YapiBoyutu,1,dosya);
    printf("\n\tKayit Silindi..");
    }

    else if(eminMi='H')
    printf("\n\tSilme isleminden vazgecildi");

    getch();
    return;
    }
    }

    printf("\n\t\tKayit Bulunamadi..");
    getch();
    return;
    }

    void kayitListele(FILE *dosya)
    {
    struct kayitYapisi insan={"","","",'H'};
    int i;
    system("cls");
    printf("%10s%20s%20s","Isim","Soyisim","Numara");

    for(i=0;i<30;i++)
    {
    fseek(dosya,i*YapiBoyutu,SEEK_SET);
    fread(&insan,YapiBoyutu,1,dosya);

    if(insan.doluMu=='E')
    {
    printf("\n%10s%20s%20s",insan.isim,insan.soyisim,insan.numara);
    }
    }
    getch();
    }

    char anaMenu()
    {
    char tus;

    system("cls");

    puts("\t Ana Menu");
    puts("\n\n\t(1) Kayit Ekle");
    puts("\n\t(2) Kayitlari Listele");
    puts("\n\t(3) Kayit Sil");
    puts("\n\t(4) Cikis");

    do{
    tus=getch();
    }while(tus<'1'||tus>'4');

    return tus;
    }



    < Bu mesaj bu kişi tarafından değiştirildi hellbas -- 1 Eylül 2014; 9:47:14 >







  • her seferinde bu yapıyı okuyabilcek veya yazcak sekilde işlem yapabilmek için.
  • Çok kısa bir cevap oldu daha fazla açıklama yapabilirmisin ?

    mesela fwrite(&insan,YapiBoyutu,1,dosya); bu kodlardaki 1 ne işe yarıyor. Yapının boyutunun ne gibi bir işlevi var.
    fread(&insan,YapiBoyutu,1,dosya);
    fseek(dosya,i*YapiBoyutu,SEEK_SET); burada tam olarak ne oluyor.Bunları açıklarsan çok iyi olur .Yinede cevap için teşekkürler.
  • dosya okurken YapiBoyutu sayısal bir değere eşit ve fseek ile dosyanın neresinden başlayıp ne kadarlık alanın işleneceğini programa söylemiş oluyorsun. yukarda tanımladığın struct n toplamı kadar.

    fseek(dosya,i*YapiBoyutu,SEEK_SET); for ' la dönerken her seferinde i ile çarparak yapıboyutunun toplam byte ı kadar ilerliyorsun. mesala yapın 20 lik ise ilkinde 20 byte lik okudun bi sonrakinde bir diğer 20 okursun.SEEK_SET ile her for donusunde 1. , 2., 3. ... kayda tek tek ulaşım sağlarsın. Yani bir nevi Word gibi dusunursen 20. harfe gelir ve bir sonraki 20 harfi okur. sonra 40 a gelir 60 a kadar falan gibisinden düşünebilirsin.
  • Kafam iyice karıştı ama cevap için teşekkürler biraz düşüncem bu konuda
  • Adam dosyayı text olarak açmış ama binary olarak okuyup yazıyor. Düzgün çalışsa bile (hiç sanmam) hiç tavsiye edilmez böyle bişey. Karakterlerin her zaman ascii formda olacağının garantisi yok. Hatta bu kod sadece ingilizce karakterlerde çalışabilir, diğerlerinde tökezler.

    Text dosyalarını fscanf (kelime kelime) ya da fgets (satır satır) ile okuyacaksın. O kodu kaldır at gitsin, bi .oka yaramaz.

    Ha bir ekleme daha yapayım. Bulduğunuz örnek kodlarda system("pause"), system("cls"), conio.h, getch(), sonsuz döngü (1 == 1 yazmış herif ) gibi şeyler görürseniz anlayın ki acemi işidir. Koşarak uzaklaşın.



    < Bu mesaj bu kişi tarafından değiştirildi Guest-BF8E9B238 -- 1 Eylül 2014; 21:28:47 >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.