如何初始化哈希表以存储在C中的文件中
我试图用C语言实现一个固定大小的哈希表,使用线性探测来解决冲突。此哈希表将存储在一个文件中,以便稍后通过生成的哈希值进行快速检索。我已经处理了大部分的纠结,但是我似乎被困在初始化我将要使用的表中。我认为使用我正在注册的结构类型的数组,然后将所有值初始化为NULL或blank是可行的方法,但现在我不太确定 我也不确定检索过程将如何工作。我还没有在网上找到任何关于C语言的有用资源。当检索特定索引的信息时,我是否需要在内存中加载整个哈希表?这似乎不切实际,或者是否有方法加载特定索引内容,可能使用lseek来定位正确的文件位置 我只包括与哈希表初始化相关的代码,但是如果需要更多,请告诉我。提前感谢:如何初始化哈希表以存储在C中的文件中,c,file,initialization,hashtable,C,File,Initialization,Hashtable,我试图用C语言实现一个固定大小的哈希表,使用线性探测来解决冲突。此哈希表将存储在一个文件中,以便稍后通过生成的哈希值进行快速检索。我已经处理了大部分的纠结,但是我似乎被困在初始化我将要使用的表中。我认为使用我正在注册的结构类型的数组,然后将所有值初始化为NULL或blank是可行的方法,但现在我不太确定 我也不确定检索过程将如何工作。我还没有在网上找到任何关于C语言的有用资源。当检索特定索引的信息时,我是否需要在内存中加载整个哈希表?这似乎不切实际,或者是否有方法加载特定索引内容,可能使用lse
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#define HSZ 10
struct client{
char last_name[80];
char maiden_name[80];
char name[80];
}client;
void init_array(){
int fd, i;
int bucket_no = 0;
struct client buff;
if ((fd = open("output", O_RDWR|O_CREAT,0777))<0){
perror("Inside init function: ");
printf("There was a problem initializing the hash table!");
}
for (i = 0; i<HSZ; i++){
strcpy(buff.name,"_");
strcpy(buff.last_name,"_");
strcpy(buff.maiden_name,"_");
lseek(fd, sizeof client * bucket_no, SEEK_SET);
write(fd, &buff, sizeof client);
bucket_no++;
}
close(fd);
}
你可以使用mmap。它基本上允许您像访问数组一样访问文件
struct stat s = stat(filename, &s);
size_t size = s.st_size;
int fd = open(filename, O_RDONLY, 0);
struct client *map = mmap(NULL, size, PROT_READ, fd, 0);
你可以使用mmap。它基本上允许您像访问数组一样访问文件
struct stat s = stat(filename, &s);
size_t size = s.st_size;
int fd = open(filename, O_RDONLY, 0);
struct client *map = mmap(NULL, size, PROT_READ, fd, 0);
虽然mmap可能是最简单的方法,但只要每个bucket的大小都是固定的,就像您的示例中一样,在读取给定的bucket之前,很容易计算要在文件中查找的偏移量,或者使用一个bucket同时执行这两个步骤
差不多
int bucket_number = 4; // 0 based like an array
struct client bucket;
lseek(hash_fd, sizeof bucket * bucket_number, SEEK_SET);
read(hash_fd, &bucket, sizeof bucket);
或
要将存储桶写入文件,请使用write或pwrite对单个存储桶使用相同的数学方法,或者在创建文件时立即写入整个数组的值。虽然mmap可能是最简单的方法,但只要每个存储桶的大小与您的示例中相同,在读取给定的偏移量之前,很容易计算要在文件中查找的偏移量,或者在一次执行两个步骤
差不多
int bucket_number = 4; // 0 based like an array
struct client bucket;
lseek(hash_fd, sizeof bucket * bucket_number, SEEK_SET);
read(hash_fd, &bucket, sizeof bucket);
或
要将存储桶写入文件,请使用write或pwrite,并对单个存储桶使用相同的数学方法,或者在创建文件时立即写入整个数组的值。为什么不使用?为什么不使用?谢谢,这对我将来肯定有用。但是,对于这个特殊的练习,我被禁止使用任何预定义的结构。谢谢,这对我将来肯定有用。但是,对于这个特殊的练习,我被禁止使用任何预定义的结构。谢谢!你的解决方案对我来说确实有效,因为它改进了写和读的方法。我只有最后一个问题。每次我使用初始化哈希表时,我都会在文件的中间得到一堆垃圾。这算正常吗?有没有办法只保留我输入的变量?我更新了代码以使其更加清晰…@LuisAlberto You'e只初始化结构中每个数组的前两个元素。剩下的都是随机垃圾字节。谢谢!你的解决方案对我来说确实有效,因为它改进了写和读的方法。我只有最后一个问题。每次我使用初始化哈希表时,我都会在文件的中间得到一堆垃圾。这算正常吗?有没有办法只保留我输入的变量?我更新了代码以使其更加清晰…@LuisAlberto You'e只初始化结构中每个数组的前两个元素。其余的被随机垃圾字节填充。