c - 将 "blank"数据 block 分配给 .dat 文件的最简单方法

标签 c file-io binaryfiles fwrite

寻找一种快速的方法来分配要从磁盘管理的数据 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/

相关文章:

c - Linux 如何确定自定义信号处理程序的优先级?

python - 在django中读取文件并写入数据库

c - 将文本文件读入结构

c - GCC不同的实际内存分配量,然后我分配给程序中的变量

php - 是否可以使用PHP生成WAV文件?

c - 如何从 C 使用 libzip 在内存中创建一个 zip 文件?

c - C 的 Doxygen——多个对象

c - 在c中打印二维字符数组

java - 从一个文件读取一个字节 block 并写入另一个文件直到读取所有 block ?

c - fseek 在运行时创建无限循环