我有一个问题,时间不够,所以我会尽量使它简洁。
我正在尝试在visual studio 2010中构建一个ATM系统(这是一个要求,所以我必须这样做)。我现在必须使用文件来记录使用ATM的人的信息(包括结构的参与)。我要做的是让文件正常工作(即写和读)。
结构:
struct studentA
{
int nip;
double Accn;
int money;
int damount;
int saccount;
};
要写入文件的函数:(我相信该部分工作正常)
int r;
FILE *fpro2;
struct studentA e={0,0,1000,0,0};
fpro2=fopen("Slr.txt","wb");
if(fpro2==NULL)
{
puts("Can't open that file!");
exit(1);
}
for(r=1000;r<=2000;++r)
{
fwrite(&e,1, sizeof(e),fpro2);
}
printf("Enter Account Number(Between 1000-2000):");
scanf("%d", &e.Accn);
fseek(fpro2, sizeof(e)*(e.Accn-1), SEEK_SET);
fwrite(&e,1, sizeof(e), fpro2);
fclose(fpro2);
printf("This File has been Updated");
getch();
system("cls");
menumain();
}
要从文件读取的函数:
(我相信这就是错误所在,但我不确定如何解决)
void tlog()
{
FILE *fpro2;
struct studentA e={0,0,1000,0,0};
fpro2=fopen("Slr.txt","rb");
if(fpro2 !=NULL)
{
fseek(fpro2, sizeof(e)*(e.Accn-1), SEEK_SET);
fread(&e,1, sizeof(e), fpro2);
fclose(fpro2);
if(e.Accn !=0)
{
printf("Student Records\n");
printf("Account: %d\n", e.Accn);
}
else
printf("No Records To Recover...Sry\n");
}
else
printf("Could not Open Siar");
getch();
menumain();
}
通常出现的问题是我“没有要恢复的记录…Sry”
但在此之前,e.Accn的声明是“%s”,发生的情况是,当我调用“tlog”时,它会打印数字,但不会打印输入的内容。例如,我输入1211,然后返回82901232或类似的内容。如有任何帮助,将不胜感激。
更新
将结构中的Accn从double更改为int,
已将acn scanf和printf从%d更改为%i,
将fseek区域中的Accn从e.Accn-1更改为e.Accn+1
最佳答案
这里的一个问题不完全是您认为的那样:如果您阅读了例如this scanf
reference的内容,您将看到"%d"
格式是针对整数的。这意味着它将读取一个整数并将其写入一个double
变量。整数的位模式与double
不同。
另一个问题是,当您阅读帐户时,您在e.Accn-1
呼叫中使用fseek
。但此时e.Accn
的值是多少?它是零,所以你试图寻找一个负位置。