C dosyalama

soon

Hectopat
Katılım
16 Şubat 2021
Mesajlar
542
Çözümler
2
Kafama takılan yeri görselde gösterdim, fseek() den önce ve sonra dosya işaretçisinin işaret ettiği yer değişmiyor, öyleyse fseek() ne iş yapmış oluyor?
Adsız.jpg

[CODE lang="c" title="C"]void updateRecords(){
FILE *filep=fopen("musteri.dat","r+");
struct customer musteri;
if(filep=='\0')
printf("Dosya Yolu Hatali!");
else{
int kontrol=1;
fread(&musteri,sizeof(struct customer),1,filep);
while(!feof(filep)){
if(musteri.deposit>300){
musteri.deposit+=50;
fseek(filep,(kontrol-1)*sizeof(struct customer),SEEK_SET);
fwrite(&musteri,sizeof(struct customer),1,filep);
}
kontrol++;
fseek(filep,(kontrol-1)*sizeof(struct customer),SEEK_SET);
fread(&musteri,sizeof(struct customer),1,filep);
}
}
fclose(filep);
}[/CODE]
 
(Kontrol - 1)*sizeof(struct customer) ilk iterasyonda 0 oluyor ve fseek bir şey yapmıyor fakat istediğiniz bu olabilir emin değilim. Yani teknik bir hata denilemez.

Demek istediğim ilk tekrar sonrada değişmiyor konum göstergeci, alttaki fseek() bir şey yapmıyor. Kodun tamamını da paylaşayım.

C:
#include <stdio.h>
/*Bir bankanın müşterilerine ait bilgiler, aşağıda verilen struct yapısı kullanılarak musteri.dat
isimli rastgele erişimli bir dosya da saklanmaktadır.
1-Banka müşterilerinden Hesabındaki para miktarı (Depozitoları) sıfırdan az
 olan kaç müşterinin olduğunu döndüren bir fonksiyon yazınız. Fonksiyonunuzu ana menüden çağırınız.
Function prototype: int listIndebtedAccounts(FILE *);
2-Müşteri bilgilerini, hesabında maksimum para tutarına sahip
 olacak şekilde döndüren bir fonksiyon yazınız. Hesabındaki para miktarı sıfırdan az olan dosyada kaç müşteri saklanır.
Function prototype: struct customer findMaxDeposit(FILE *);
3- Müşterilerinin tüm bilgilerini, hesabı 300'den büyük veya ona eşit olan “list.txt” adında
 sıralı bir erişim dosyasına aktaran fonksiyonu yazınız.
Function prototype: void transferRecords(FILE *);
4-Müşteri hesaplarını değerini 50 artıran bir fonksiyon yazın ve hesabı 300'den büyük veya ona eşit olan tüm müşterilerin
 kaydını güncelleyin.
Function prototype: void updateRecords(FILE *); */
void createFile();
void fileFill();
void fileList();
int listIndebtedAccounts();
void transferRecords();
void updateRecords();

struct customer{
 int account;
 char name[25];
 double deposit;
};

int main ()
{
 int secim,musteri;
 printf("1-Dosyadaki olustur\n2-Dosyayi Doldur\n3-Dosyayi Listele\n4-Depozitolari sifirdan azolan musteri sayisi\n5-Hesabi 300'den buyuk veya ona esit olan list.txt aktar\n6-Kayit guncelle\n");

while(1) {
 printf("Secim:");
 scanf("%d",&secim);
 if(secim==1)
 createFile();
 else if(secim==2)
 fileFill();
 else if(secim==3)
 fileList();
 else if (secim==4){
 musteri=listIndebtedAccounts();
 printf("musteri sayisi:%d\n",musteri);
 }
 else if (secim==5)
 transferRecords();
 else if (secim==6)
 updateRecords();
 else ;
}
 return 0;
}

void createFile(){
 int kontrol=1;
 FILE *filep=fopen("musteri.dat","w");
 struct customer musteri={0,"",0.0};
 if(filep=='\0')
 printf("Dosya Olusturulamadi!\n");
 else{
 for(kontrol;kontrol<=100;kontrol++)
 fwrite(&musteri,sizeof(struct customer),1,filep);
 }
 printf("Dosya Olusturuldu\n");
 fclose(filep);
}
void fileFill(){
 FILE *filep=fopen("musteri.dat","r+");
 struct customer musteri={0,"",0.0};
 if(filep=='\0')
 printf("Dosya Yolu Hatali!\n");
 else{
 printf("Musteri Bilgilerini Giriniz Yeterli Musteri Sayisina Ulastiginizda account=0 tuslayiniz\n");
 printf("Account:");
 scanf("%d",&musteri.account);
 while(musteri.account!=0){
 printf("Name:");
 scanf ("%s",musteri.name);
 printf("Depozit:");
 scanf("%lf",&musteri.deposit);
 fseek(filep,sizeof(struct customer)*(musteri.account-1),SEEK_SET);
 fwrite(&musteri,sizeof(struct customer),1,filep);
 printf("Account:");
 scanf("%d",&musteri.account);
 }
 }
 printf("Musteri Bilgileri Basarili Bir Sekilde Kaydedildi\n");
 fclose(filep);
}
void fileList(){
 FILE *filep=fopen("musteri.dat","r");
 struct customer musteri={0,"",0.0};
 if(filep=='\0')
 printf("Dosya Yolu Hatali!\n");
 else{
 fread(&musteri,sizeof(struct customer),1,filep);
 while(musteri.account!=0){
 printf("Account:%d Name:%s Deposit:%lf\n",musteri.account,musteri.name,musteri.deposit);
 fread(&musteri,sizeof(struct customer),1,filep);
 }
 }
 fclose (filep);
}
int listIndebtedAccounts(){
 FILE *filep=fopen("musteri.dat","r");
 struct customer musteri={0,"",0.0};
 int kontrol=0;
 if(filep=='\0')
 printf("Dosya Yolu Hatali!\n");
 else{
 while(!feof(filep)){
 fread(&musteri,sizeof(struct customer),1,filep);
 if(musteri.deposit<0)
 kontrol++;
 else ;
 }
 }
 fclose(filep);
 return kontrol;
}
void transferRecords(){
 FILE *filep1=fopen("list.txt","w");
 FILE *filep2=fopen("musteri.dat","r");
 struct customer musteri={0,"",0.0};
 if(filep2=='\0')
 printf("Dosya Yolu Hatali!");
 else{

 while(!feof(filep2)){
 fread(&musteri,sizeof(struct customer),1,filep2);
 if(musteri.deposit>=300)
 fwrite(&musteri,sizeof(struct customer),1,filep1);
 }
 }
 fclose(filep1);
 fclose(filep2);
 printf("Yeni Dosya Olusturuldu Ve Veriler Tasindi\n");
}
void updateRecords(){
 FILE *filep=fopen("musteri.dat","r+");
 struct customer musteri;
 if(filep=='\0')
 printf("Dosya Yolu Hatali!");
 else{
 int kontrol=1;
 fread(&musteri,sizeof(struct customer),1,filep);
 while(!feof(filep)){
 if(musteri.deposit>300){
 musteri.deposit+=50;
 fseek(filep,(kontrol-1)*sizeof(struct customer),SEEK_SET);
 fwrite(&musteri,sizeof(struct customer),1,filep);
 }
 kontrol++;
 fseek(filep,(kontrol-1)*sizeof(struct customer),SEEK_SET);
 fread(&musteri,sizeof(struct customer),1,filep);
 }
 fileList();
 }
 fclose(filep);

}
 

Geri
Yukarı