寻找一种快速的方法来分配要从磁盘管理的数据 block 。我正在分配一个由 50 个结构组成的 block ,虽然大部分内存分配得很好,但当我全部读回时,我在一些本应为空白的字段中收到了垃圾消息。我假设这是我以某种方式错误地分配了空间,导致内存中的一些垃圾泄漏到那里。
if ((fpBin = fopen(BINARYFILE, "w+b")) == NULL)
{
printf("Could not open binary file %s.\n", BINARYFILE);
return;
}
fwrite(fpBin, sizeof(struct student), 50, fpBin); //Write entire hash table to disk
结构定义
typedef struct student
{
char firstName[20]; //name
char lastName[20];
double amount; //amount owed
char stuID[5]; //4 digit code
}student;
这是我被教导的方式,但我的数据中仍然有一些垃圾,而不是一个干净的石板。所以问题:如何将所有字段设置为空白?
回答:
student tempStu[50] = {0};
fwrite(tempStu, sizeof(struct student), BUCKETSIZE, fpBin); //Write entire hash table to disk
最佳答案
fwrite(fpBin, sizeof(struct student), 50, fpBin);
您正在将文件指针而不是学生结构写入磁盘。第一个 fpBin
应该是指向您的数据的指针。该数据可以是初始化为 0 的 50 个学生结构的数组,可能使用 calloc 或通过在文件范围内定义它,但它必须在某个地方。相反,您正在从 fpBin
指针写入 50*sizeof(struct student) 字节,这是未定义的行为——您要么因访问冲突而崩溃,要么将垃圾写入磁盘。当您回读它时,您会得到这些垃圾。
此外,使用像 50
这样的常量是不好的做法……它应该是一个变量(或 list 常量),用于保存您正在写出的学生人数。
顺便说一句,在 Linux 和其他 POSIX 系统上,您可以通过写入最后一个字节(或以其他方式使文件变大)在磁盘上分配一个零 block 。
关于c - 将 "blank"数据 block 分配给 .dat 文件的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728370/