C语言(二进制)中,fseek之后使用fwrite出现问题

3
有什么想法,为什么以下代码无法正常工作?
我的结构体:
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,Random Name,50.00”。

然后,我将把3读入到MyRecords.Number中(我已经测试过到这一点)。 当指针位于名称上时,我尝试将其以及薪水覆盖为新的名称和薪水。

但出现问题。 我已尝试将文件打开更改为ab +,wb +,rb +,rb等,但均未成功。


当你说“它不起作用”时,你具体指的是什么?你是否遇到编译错误,或者抛出异常,或者它只是没有按照你想要的方式工作? - Chris Parton
1
它为什么不工作?发生了什么?应该发生什么?你确定sizeof(struct Records)是你需要前后跳转的大小吗?这取决于你如何编写记录,请记住所有结构成员大小的总和可能与整个结构的大小不同。此外,所有这些函数(scanf / fseek / fwrite ...)都返回错误/成功代码。您应该检查这些,否则您怎么知道什么时候出现问题? - nos
1
没有任何错误。它的读取很正常,但是它的写入不太对。使用 w+b 会用两个空值覆盖整个文件,使用 ab/rb 则没有任何写入。 - Amir
我确定我已经到了正确的位置,因为在fseek之后我测试了fread值,结果是3 - 正确的。 我需要在那个3之后覆盖接下来的两个变量 - 一个字符串和一个浮点数。 - Amir
4个回答

3

在我看来,你应该始终在代码中使用完整的结构体:读取它(即 fread(&MyRecords, sizeof(MyRecord)...) ),更改结构体的元素,再次使用 fseek 返回相同的位置,最后将整个结构体 fwrite。你现在这种方式可能会遇到任何数据对齐问题。


我按照你说的修改了它,修改后的代码完美地运行了;太棒了 :)) - Amir

0
就像Chris所说的那样,你需要更具体地说明哪些部分出了问题。乍一看你的代码似乎是正确的。你已经验证过binaryfile.dat是否确实存在于你运行程序的文件夹中,并且它的格式是否正确吗?

0

尝试从中删除&

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

0
你需要使用"r+b",因为使用"w+b"会擦除文件(正如你所观察到的),而"ab"或"rb"都不允许向文件写入内容 - 你需要在其中加入"+"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接