#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define I 27
#define DosyaAdi "test.txt"
struct müşteri
{
char iban[I];
long long tc;
int bakiye;
};
int ibankontrol(char iban[])
{
if(!isalpha(iban[0]) || !isalpha(iban[1]))
return 0;
for (int i = 2; i < 27; i++)
{
if (iban[i]<48 || iban[i]>57)
{
return 0;
}
}
return 1;
}
int tckontrol(long long tc)
{
int a=0,bas;
long long i=1;
while (a<11)
{
bas=(tc/i)%10;
if (bas<0 || bas>9)
{
return 0;
}
i*=10;
a++;
}
if (tc / i > 0) {
return 0;
}
return 1;
}
int kaydet(struct müşteri m)
{
FILE *dosya;
dosya=fopen(DosyaAdi,"a");
if (dosya==NULL)
{
printf("\nKayıt başarısız\n");
return 0;
}
fprintf(dosya,"%lld %d %s\n",m.tc,m.bakiye,m.iban);
fclose(dosya);
return 1;
}
int havale(char kaynak[],char hedef[],int miktar)
{
struct müşteri müşteriler[100];
int i=0,y=0,z=0;
char string[100];
FILE *dosya;
dosya=fopen(DosyaAdi,"r");
while (1)
{
if ((fgets(string,100,dosya))==NULL)
{
break;
}
sscanf(string,"%lld %d %s",&müşteriler[i].tc,&müşteriler[i].bakiye,müşteriler[i].iban);
i++;
}
for(z=0;z<i;z++)
{
printf("\nGuncel bilgiler:\n");
printf("%d: %s %lld %d\n",z+1,müşteriler[z].iban,müşteriler[z].tc,müşteriler[z].bakiye);
}
fclose(dosya);
for (int j = 0; j < i; j++)
{
if (strcmp(kaynak,müşteriler[j].iban) == 0)
{
müşteriler[j].bakiye -= miktar;
y++;
}
if (strcmp(hedef,müşteriler[j].iban) == 0)
{
müşteriler[j].bakiye += miktar;
y++;
}
}
if (y != 2)
{
return 0;
}
dosya = fopen(DosyaAdi, "w");
if (dosya == NULL)
{
printf("Dosya açılamadı.\n");
return 0;
}
for (int s = 0; s < i; s++)
{
fprintf(dosya, "%lld %d %s", müşteriler[s].tc, müşteriler[s].bakiye, müşteriler[s].iban);
if (s!=i-1)
{
printf("\n");
}
}
fclose(dosya);
return 1;
}
int main()
{
int seçim;
int dönüş=0,kontrol=0;
char kaynak[27],hedef[27];
int miktar=0;
struct müşteri m;
while (1)
{
printf("Menü:\n");
printf("1:Kayıt\n");
printf("2:Havale\n");
printf("3:Çıkış\n");
printf("Seçiminiz: ");
scanf("%d",&seçim);
switch (seçim)
{
case 1:
while (1)
{
printf("İban giriniz: ");
scanf("%s",m.iban);
fflush(stdin);
dönüş=ibankontrol(m.iban);
if (dönüş==0)
{
printf("İban yanlış");
}
else if (dönüş==1)
{
break;
}
}
while (1)
{
printf("TC giriniz");
scanf("%lld",&m.tc);
dönüş=tckontrol(m.tc);
if (dönüş==0)
{
printf("TC yanlış");
}
else if (dönüş==1)
{
break;
}
}
printf("Bakiye giriniz");
scanf("%d",&m.bakiye);
kontrol=kaydet(m);
if (kontrol==0)
{
printf("Kayıt başarısız");
}
else if (kontrol==1)
{
break;
}
break;
case 2:
printf("Kaynak iban: ");
scanf("%s",kaynak);
fflush(stdin);
printf("Hedef iban: ");
scanf("%s",hedef);
fflush(stdin);
printf("Gönderilicek miktar: ");
scanf("%d",&miktar);
int a=havale(kaynak,hedef,miktar);
if (a==0)
{
printf("Havale başarısız\n");
}
break;
case 3:
exit(2);
break;
default:
printf("geçersiz işlem");
break;
}
}
return 0;
}
在我的代码中,当输入信息时,我将其处理到文件中,然后,在进行传输时,我删除该文件并在交易后将其写回到文件中。虽然在我的代码中正确执行了注册过程,但转账交易并未正确发生。我认为这是一个空白字符,但你觉得呢?
写入文件时,
iban
字段后面没有分隔符。因此,当您尝试从文件中读取时,下一项的 tc
将被读取为 iban
的一部分,并且您将失去同步。
将每个项目写入不同的行。换行符将终止读取
iban
。
fprintf(dosya, "%lld %d %s\n", müşteriler[s].tc, müşteriler[s].bakiye, müşteriler[s].iban);