C'de Dosyalara Erişim (Veri Yapıları)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

struct student
{
int id;
char name[20];
int score;
};


int main()
{
struct student s;
FILE *fp,*f;
int n,rec;

int selection;
while (1)
{
printf("*** *** ***\n");
printf(" 1 --> Dosyaya kayit ekle \n");
printf(" 2 --> Dosyadan kayit oku(sirali erisim ile) \n");
printf(" 3 --> Dosyadan kayit oku(dogrudan erisim ile) \n");
printf(" 4 --> Sonlandir \n");
printf(" 5 --> Erisim surelerini kiyasla \n");
printf("*** *** ***\n");

printf("Seciminizi girin: ");
scanf("%d", &selection);

switch (selection) {
case 1:
//dosyayı append modunda hem okuma hem yazma icin acalim
fp=fopen("students.txt","a+");
//kullanicidn bilgi alarak dosyaya eklenecek kayiti olusturma
printf("\n\nid:");
scanf("%d",&s.id);
printf("Name:");
scanf("%s",s.name);
printf("Score:");
scanf("%d",&s.score);
//kaydi dosyaya yazma
fwrite(&s,sizeof(s),1,fp);
fclose(fp);
break;
case 2:
fp=fopen("students.txt","a+");
printf("\nDosyadaki kacinci kaydi okumak istiyorsunuz:");
scanf("%d",&rec);
//gecerli bir sayi girdigini farzedelim
fseek(fp,SEEK_SET,0); //dosyanin basini isaret ediyor
int count=0;
while(count!=rec-1){
fread(&s,sizeof(s),1,fp);
count++;
}
//rec-1 kadar kayit okundu, simdi okunacak kayit bizim ulasmak istedigimiz kayit
fread(&s,sizeof(s),1,fp);
printf("id:%d\nName:%s\nScore:%d\n",s.id,s.name,s.score);
fclose(fp);
break;
case 3:
fp=fopen("students.txt","a+");
printf("\nDosyadaki kacinci kaydi okumak istiyorsunuz:");
scanf("%d",&rec);
//gecerli bir sayi girdigini farzedelim
fseek(fp,(rec-1)*sizeof(s),0); //dogrudan kaydin oldugu yeri isaret ediyoruz
fread(&s,sizeof(s),1,fp);
printf("id:%d\nName:%s\nScore:%d\n",s.id,s.name,s.score);
fclose(fp);
break;
case 4:
return 0;
case 5:
f=fopen("test.txt","a+");
clock_t begin,end;
double duration;
struct student test;
test.id=10;
strcpy(test.name,"ali");
test.score=50;

int counter=1000;
int record=counter-1;
printf("Test amacli %d kayit iceren test.txt adli dosya olusturuldu\n",counter);
printf("%d. kayda erisim icin gecen sureler hesaplandi\n",record);
while(counter--){
fwrite(&test,sizeof(test),1,f);
}
fseek(f,SEEK_SET,0);
counter=1000;
//sonuncu kaydi okumak istedigini varsayalim yani counter.kayit

//sirali erisimle okuma
/*******************************/
begin=clock();
count=0;
while(count!=record-1){
fread(&test,sizeof(test),1,f);
count++;
}
//bizim ulasmak istedigimiz kayit
fread(&test,sizeof(test),1,f);
end=clock();
duration=(double)(end-begin)/ CLOCKS_PER_SEC;
printf("Sirali erisimle:%f sn\n", duration);
/*******************************/

fseek(f,SEEK_SET,0);
//dogrudan erisimle okuma
/*******************************/
begin=clock();
fseek(f,(record-1)*sizeof(test),0); //dogrudan kaydin oldugu yeri isaret ediyoruz
fread(&test,sizeof(test),1,f);
end=clock();
duration=(double)(end-begin)/ CLOCKS_PER_SEC;
printf("Dogrudan erisimle:%f sn\n", duration);
/*******************************/
fclose(f);
break;

}
}

return 0;
}


Yorumlar

Popüler Yayınlar