Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在算术运算中使用文件中的struct变量?_C_Math_File Handling - Fatal编程技术网

如何在算术运算中使用文件中的struct变量?

如何在算术运算中使用文件中的struct变量?,c,math,file-handling,C,Math,File Handling,我有一个项目,一个ATM帐户系统,使用c语言的文件和结构。 现在,除了存款/取款功能外,我几乎拥有了所有功能。 如果我没有弄错的话,您只需要读取文件并调用您希望在算术运算中使用的变量,然后将其写回文件以更新它 如果用户为所述变量输入一个新值(但我不能有这个值,因为用户可以随意更改他/她的帐户余额) 但当我这么做的时候,它就不起作用了 简言之,我的问题是我的交易(用户输入存款金额,系统将该金额添加到保存在二进制文件中的用户帐户余额中,然后系统为新帐户余额获取这两个金额的总和,然后覆盖旧帐户余额)不

我有一个项目,一个ATM帐户系统,使用c语言的文件和结构。 现在,除了存款/取款功能外,我几乎拥有了所有功能。 如果我没有弄错的话,您只需要读取文件并调用您希望在算术运算中使用的变量,然后将其写回文件以更新它

如果用户为所述变量输入一个新值(但我不能有这个值,因为用户可以随意更改他/她的帐户余额)

但当我这么做的时候,它就不起作用了

简言之,我的问题是我的交易(用户输入存款金额,系统将该金额添加到保存在二进制文件中的用户帐户余额中,然后系统为新帐户余额获取这两个金额的总和,然后覆盖旧帐户余额)不起作用,我的结构和用户输入变量不在一起

这是我的函数

void deposit()
{
   system("cls");
   FILE *fp,*fp1;
   struct acc rec,rec1;
   int id,pinc,found=0,count=0;
   float dv=0,wv=0;
   fp=fopen(fname,"rb");
   fp1=fopen("tempacc.dat","wb");

   printf("\nEnter Account No :");
   scanf("%d",&id);
   printf("\nEnter PIN :");
   scanf("%d",&pinc);

   while(1)
   {
     fread(&rec,sizeof(rec),1,fp);

   if(feof(fp))
   {
      break;
   }
   if(rec.no==id && rec.pin==pinc)
   {
     found=1;
     printf("current balance:%0.2f",&rec.id);
     printf("\nEnter initial deposit:");
     scanf("%d",&rec.id);
     printf("\nEnter Deposit value:");
     scanf("%f",dv);
     rec.id = rec.id + dv; <--- (this part doesn't work)
     printf("\nNew Account Balance:%f",rec.id);
     fwrite(&rec,sizeof(rec),1,fp1);
   }
    else
   {
    fwrite(&rec,sizeof(rec),1,fp1);
   }
   }
   fclose(fp);
   fclose(fp1);

   if(found==0)
   {
    printf("Sorry No Record Found\n\n");
   }
   else
   {
    fp=fopen(fname,"wb");
    fp1=fopen("tempacc.dat","rb");

   while(1)
   {
     fread(&rec,sizeof(rec),1,fp1);

   if(feof(fp1))
   {
      break;
   }
   fwrite(&rec,sizeof(rec),1,fp);
  }

}
fclose(fp);
fclose(fp1);
}
无效存款()
{
系统(“cls”);
文件*fp,*fp1;
结构acc rec,rec1;
int-id,pinc,found=0,count=0;
浮点数dv=0,wv=0;
fp=fopen(fname,“rb”);
fp1=fopen(“临时数据”、“wb”);
printf(“\n输入帐号:”);
scanf(“%d”和&id);
printf(“\n输入PIN:”);
scanf(“%d”、&pinc);
而(1)
{
fread(&rec,sizeof(rec),1,fp);
if(feof(fp))
{
打破
}
if(rec.no==id&&rec.pin==pinc)
{
发现=1;
printf(“当前余额:%0.2f”,&rec.id);
printf(“\n输入初始存款:”);
scanf(“%d”和记录id);
printf(“\n输入存款价值:”);
扫描频率(“%f”,dv);

rec.id=rec.id+dv;缺少更多细节,我猜您的
scanf
组合实际上是读取
%d%f
,即紧跟在浮点数之后的十进制数。如果是这种情况,它应该工作,在某种程度上:如果您输入
123.456
,它应该接受初始存款
123
新存款
0.456

但我猜您的意思是让用户输入两个不同的数字,中间有enter。如果是这样,您的输入将是第一个数字,然后是换行符,然后是第二个数字。您需要将其解析为
%d%f
(因为空格匹配任何数量的空格,包括换行符)。如果您不希望第一个
scanf
等待第一个数字后的第一个非空格,我建议您将空格与第二个
scanf
一起包含,即进行该扫描
%f


如果所有这些都是错误的,那么您的
scanf
很可能仍然有问题,因此您应该对此进行错误检查。阅读手册,看看它应该返回什么以获得有效输入,然后让您的代码投诉,如果这不是它得到的信息。

错误消息是什么?这通常有助于解释错误。什么是de>struct acc
?这看起来也不对,您是否注意到当前余额已经不正确了?
printf(“当前余额:%0.2f”,&rec.id);
缺少缩进,代码完全不可读。此外,您的描述不足以理解您实际想要实现的目标。@Raymond如果没有错误消息,这就是我在这里询问的原因。您需要更具体地说明“它就是不起作用”的意思由于代码是编译的,您可以使用调试器查看正在发生的情况。请阅读有关如何生成调试器的内容。您的代码既不是最小的,也不是完整的。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct acc
{
    int no;
    char name[100];
    int pin;
    float id;
}; 

void append();
void display();
void displayAll();
void modify();
void search();
void deposit();

char mygetch();

char fname[]={"accdb.dat"};

int main()
{
char ch;

while(1)
{
system("cls"); //clrscr();

printf("==================Welcome to Banking System=============\n\n");

printf("A. Open an Account \n\n");
printf("B. Bank transaction \n\n");
printf("C. Exit\n\n");
//printf("D. Display\n\n");
//printf("E. Display All\n\n");
//printf("F. Search\n\n");

printf("========================================================\n\n");

printf("\nPlease enter your Choice:");
scanf("%c",&ch);

switch(ch)
{
case 'A': append();
break;

case 'B': modify();
break;

case 'C': exit(0);

case 'D': display();
break;

case 'E': displayAll();
break;

case 'F':   search();
break;

}

mygetch();
}

return 0;
}
void append()
{
system("cls");
FILE *fp;
struct acc rec;

fp=fopen(fname,"ab");

printf("\nEnter Account no:");
scanf("%d",&rec.no);
getchar();
printf("\nEnter Account name:");
scanf("%[^\n]s",rec.name);
printf("\nEnter PIN:");
scanf("%d",&rec.pin);
printf("\nEnter Initial Deposit:");
scanf("%f",&rec.id);
fwrite(&rec,sizeof(rec),1,fp);

fclose(fp);
}

void display()
{
system("cls");
FILE *fp;
struct acc rec;
int id,found=0;

fp=fopen(fname,"rb");

printf("\nEnter the account number:");
scanf("%d",&id);

while(1)
{
fread(&rec,sizeof(rec),1,fp);

if(feof(fp))
{
break;
}
if(rec.no==id)
{
found=1;
printf("\n========================================================\n\n");
printf("\t\t Account Details of %d\n\n",rec.no);
printf("========================================================\n\n");

printf("Name\tBalance\n\n");

printf("%s\t",rec.name);
printf("%0.2f\t\n\n",rec.id);

printf("========================================================\n\n");
}
}
if(found==0)
{
printf("\nSorry No Record Found");
}
fclose(fp);

}

void deposit()
{
system("cls");
FILE *fp,*fp1;
struct acc rec,rec1;
int id,pinc,found=0,count=0;
float dv=0,wv=0;
fp=fopen(fname,"rb");
fp1=fopen("tempacc.dat","wb");

printf("\nEnter Account No :");
scanf("%d",&id);
printf("\nEnter PIN :");
scanf("%d",&pinc);

while(1)
{
fread(&rec,sizeof(rec),1,fp);

if(feof(fp))
{
break;
}
if(rec.no==id && rec.pin==pinc)
{
found=1;
printf("current balance:%0.2f",&rec.id);
printf("\nEnter initial deposit:");
scanf("%d",&rec.id);
printf("\nEnter Deposit value:");
scanf("%f",dv);
rec.id = rec.id + dv;
//scanf("%f",&rec.id);
printf("\nNew Account Balance:%f",rec.id);
//scanf("%f",&rec.id);
fwrite(&rec,sizeof(rec),1,fp1);
//fflush(stdin);


}
else
{
fwrite(&rec,sizeof(rec),1,fp1);
}
}
fclose(fp);
fclose(fp1);

if(found==0)
{
printf("Sorry No Record Found\n\n");
}
else
{
fp=fopen(fname,"wb");
fp1=fopen("tempacc.dat","rb");

while(1)
{
fread(&rec,sizeof(rec),1,fp1);

if(feof(fp1))
{
break;
}
fwrite(&rec,sizeof(rec),1,fp);
}

}
fclose(fp);
fclose(fp1);
}

void search()
{
FILE *fp;
struct acc rec;
int found=0;
char name[20];

fp=fopen(fname,"rb");

printf("\nEnter the Account Name:");
scanf("%s",&name);

while(1)
{
fread(&rec,sizeof(rec),1,fp);

if(feof(fp))
{
break;
}
if(strcmp(name,rec.name)==0)
{
printf("\n========================================================\n\n");
printf("\t\t Account Details of %d\n\n",rec.no);
printf("========================================================\n\n");

printf("Name\tbalance\n\n");

printf("%s\t",rec.name);
printf("%0.2f\t\n\n",rec.id);

printf("========================================================\n\n");

}
}
if(found==0)
{
printf("\nSorry No Record Found");
}
fclose(fp);
}

void displayAll()
{
system("cls");
FILE *fp;
struct acc rec;

fp=fopen(fname,"rb");

printf("\n========================================================\n\n");
printf("\t\t All Account Details\n\n");
printf("========================================================\n\n");

printf("ID\tName\tPIN\tBalance\n\n");

while(1)
{
fread(&rec,sizeof(rec),1,fp);

if(feof(fp))
{
break;
}
printf("%d\t",rec.no);
printf("%s\t",rec.name);
printf("%d\t",rec.pin);
printf("%0.2f\t\n\n",rec.id);


}
printf("========================================================\n\n");

fclose(fp);
}

char mygetch()
{
char val;
char rel;

scanf("%c",&val);
scanf("%c",&rel);
return (val);
}

void modify()
{
system("cls");
FILE *fp,*fp1;
struct acc rec,rec1;
int id,pinc,found=0,count=0;

fp=fopen(fname,"rb");
fp1=fopen("tempacc.dat","wb");

printf("\nEnter Account No:");
scanf("%d",&id);
printf("\nEnter PIN:");
scanf("%d",&pinc);

while(1)
{
fread(&rec,sizeof(rec),1,fp);

if(feof(fp))
{
break;
}
if(rec.no==id && rec.pin==pinc)
{
found=1;
int sch;

printf("\tWelcome to Banking System\n");
            printf("1.Balance Inquiry\n");
            printf("2.Deposit\n");
            printf("3.Withdrawal\n");
            printf("4.quit\n");
scanf("%d",&sch);

switch (sch)
{
    case 1:
        display();
        break;
    case 2:
        fclose(fp);
        deposit();
        break;
    case 3:
        //withdrawal();
        break;
    case 4:
        printf("Thank you for your patronage\n");
        exit(0);
        break;
}
}
}
}