fseek后fwrite的麻烦 - C(二进制)

时间:2011-11-21 13:40:27

标签: c binary

知道以下代码无效的原因吗?

我的结构:

struct Records
{
    int Number;
    char Name[20];
    float Salary;
};

主要代码:

FILE * binaryfile;
binaryfile = fopen("binaryfile.dat","r+b");

struct Records MyRecords;

printf("Name: \n");
gets(MyRecords.Name);

printf("Yearly Salary: \n");
scanf("%f%*c",&MyRecords.Salary);

fseek(binaryfile,2L*sizeof(struct Records),SEEK_SET);

fread(&MyRecords.Number, sizeof(MyRecords.Number), 1, binaryfile);
fwrite(&MyRecords.Name, sizeof(MyRecords.Name), 1, binaryfile);
fwrite(&MyRecords.Salary, sizeof(MyRecords.Salary), 1, binaryfile);

我错过了二元课,所以我对此的理解非常不稳定,但这就是我想要做的:

使用fseek,我将进入第3条记录的开头,即“3,随机名称,50.00”。

然后我将3读入MyRecords.Number(我已经测试过这一点)。然后当指针在名字上时,我试图用新的覆盖它和薪水。

但不知怎的,它不起作用。我已经尝试将文件打开更改为ab +,wb +,rb +,rb等内容,但没有成功。

4 个答案:

答案 0 :(得分:3)

恕我直言,你总是应该在你的代码中使用一个完整的结构:读取它(即fread(& MyRecords,sizeof(MyRecord)...)),在同一个地方再次更改元素,fseek并整个写入结构体。您的工作方式可能会遇到数据对齐方面的任何问题。

答案 1 :(得分:0)

像克里斯所说的那样,你需要更加明确一些不起作用的东西。随便看一下你的代码似乎是正确的。您是否验证过binaryfile.dat确实存在于您运行该程序的文件夹中,并且它的格式是应该的?

答案 2 :(得分:0)

尝试删除&

fwrite(&MyRecords.Name, sizeof(MyRecords.Name), 1, binaryfile);
       ^

答案 3 :(得分:0)

您需要使用“r + b”,因为使用“w + b”将删除文件(如您所见)并且“ab”或“rb”将不允许写入文件 - 您需要“ +“也在那里。