尝试编写一个将我的结构数组写入二进制文件的函数 我以为我能够一次将它复制成一个完整的单元阵列,但它对我不起作用。
我是否需要编写每个子实体或者是否有办法在大块中执行此操作?
{
void export_binary(char *data_base_name, student_record *ptr,int array_flag,unsigned int rec_cnt)
{
if (array_flag==-99)
{
printf("\n\nDatabase not loaded...\n\nPlease IMPORT or CREATE a new database.\n\n");
system("pause");
return;
}
int rec_counter;
FILE *pf;
pf=fopen(data_base_name,"wb");
if (!pf)
{
printf("*** FILE OPENING ERROR ***\n\n");
system("pause");
return ;
}
for ( rec_counter=0; rec_counter <= rec_cnt; rec_counter++)
{
fwrite(&ptr[rec_counter], sizeof(student_record), 1, pf);
}
if ((fclose(pf))!=0)
{
printf("\n\n*** FILE Error - Closing file FAILED! ***\n\n");
system("pause");
return;
}
printf("\n\n*** Database SAVED ***");
system("pause");
return;
}
答案 0 :(得分:2)
你实际上并未说明错误是(当你试图寻求帮助时这是非常重要的)但是,如果你的结构中没有像指针一样的东西,您可以通过替换:
一次完成所有操作for ( rec_counter=0; rec_counter <= rec_cnt; rec_counter++)
{
fwrite(&ptr[rec_counter], sizeof(student_record), 1, pf);
}
使用:
int actual = fwrite (ptr, sizeof(student_record), rec_cnt, pf);
if (actual != rec_cnt) ... a problem occurred.
(你应总是检查返回值)。
所以不,你不必分别在数组中编写每个结构的每个元素,你可以采用另一种方式在一次命中中编写整个数组。
关于您的其他信息:
我得到的文件中包含我的记录元素,但其他所有内容都是垃圾。
是的,如果你写的记录多于你填写的记录,你会的。换句话说,如果rec_cnt
是数组的大小而不是你填充的数组元素的数量,那么你最后会有垃圾。
我假设(可能是错误的)rec_cnt
是填充的元素数量。你应该有一个在某处具有该值的变量(如果rec_cnt
不是它),否则你不知道哪些元素是好的,哪些元素是垃圾。
使用 变量来决定使用fwrite
写入多少元素。
如果后面的数组元素不是垃圾,而是每个元素中未使用的空间,那是预期的和不相关的。允许结构在其中(以及最后)具有填充以用于对齐目的。
如果在写入和阅读时填充相同,您可以放心地忽略它。
如果对齐可能不同,是的,您可能需要:
#pragma pack
);或