【问题标题】:using files to write to record and view it in c使用文件写入记录并在c中查看
【发布时间】:2014-03-30 18:11:35
【问题描述】:

我遇到了一个问题并且时间不够用,所以我尽量让它简洁。

我正在尝试在 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();
    }

通常出现的问题是我得到“没有要恢复的记录......对不起”

然而,在此之前,e.Accn 的声明是“%s”,发生的事情是当我调用“tlog”时它会打印数字,但不会打印输入的内容。例如,我输入 1211 并返回 82901232 或类似的东西。任何帮助将不胜感激。

更新

将结构中的 Accn 从 double 更改为 int, 将 Accn scanf 和 printf 从 %d 更改为 %i, 将fseek区的Accn由e.Accn-1改为e.Accn+1

【问题讨论】:

  • 您为什么使用double 作为帐号?我从未见过浮点帐号。
  • //让帐号翻倍只是为了看到一些变化而感到沮丧
  • @AtlasB 将格式更改为printf("Account: %lf\n", e.Accn);
  • @chux 它没有显示任何效果,我在 tlog 中使用它但它仍然只是给出了 else 语句

标签: c arrays file struct


【解决方案1】:

这里的一个问题并不是你想象的那样:如果你阅读例如this scanf reference 你会看到"%d" 的格式是整数。这意味着它将读取一个整数并将其写入double 变量。整数的位模式与double 不同。

另一个问题是,当您阅读帐户时,您在fseek 调用中使用了e.Accn-1。但是此时e.Accn 的价值是多少?它是,所以你试图寻找一个负面的位置。

【讨论】:

  • 非常感谢您的回复,我已将结构中的“Accn”更改为 int。本节的目标是创建 2000 条记录,但只会使用后 1000 条记录,所以我假设,按照您的指示,我应该将 e.Accn-1 更改为 e.Accn+1(我这样做了)。然而,进行这些更改并没有太大改变结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多