Arama butonu
Bu konudaki kullanıcılar: 1 misafir
5
Cevap
317
Tıklama
0
Öne Çıkarma
Şu kodun işlevini anlayamadım bir türlü
H
10 yıl
Çavuş
Konu Sahibi


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 >

İ
10 yıl
Yüzbaşı

her seferinde bu yapıyı okuyabilcek veya yazcak sekilde işlem yapabilmek için.


Bu mesaja 1 cevap geldi.
H
10 yıl
Çavuş
Konu Sahibi

Ç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.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Erdinc20
İ
10 yıl
Yüzbaşı

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.



H
10 yıl
Çavuş
Konu Sahibi

Kafam iyice karıştı ama cevap için teşekkürler biraz düşüncem bu konuda



G
10 yıl
Yarbay

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 >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.