Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何初始化哈希表以存储在C中的文件中_C_File_Initialization_Hashtable - Fatal编程技术网

如何初始化哈希表以存储在C中的文件中

如何初始化哈希表以存储在C中的文件中,c,file,initialization,hashtable,C,File,Initialization,Hashtable,我试图用C语言实现一个固定大小的哈希表,使用线性探测来解决冲突。此哈希表将存储在一个文件中,以便稍后通过生成的哈希值进行快速检索。我已经处理了大部分的纠结,但是我似乎被困在初始化我将要使用的表中。我认为使用我正在注册的结构类型的数组,然后将所有值初始化为NULL或blank是可行的方法,但现在我不太确定 我也不确定检索过程将如何工作。我还没有在网上找到任何关于C语言的有用资源。当检索特定索引的信息时,我是否需要在内存中加载整个哈希表?这似乎不切实际,或者是否有方法加载特定索引内容,可能使用lse

我试图用C语言实现一个固定大小的哈希表,使用线性探测来解决冲突。此哈希表将存储在一个文件中,以便稍后通过生成的哈希值进行快速检索。我已经处理了大部分的纠结,但是我似乎被困在初始化我将要使用的表中。我认为使用我正在注册的结构类型的数组,然后将所有值初始化为NULL或blank是可行的方法,但现在我不太确定

我也不确定检索过程将如何工作。我还没有在网上找到任何关于C语言的有用资源。当检索特定索引的信息时,我是否需要在内存中加载整个哈希表?这似乎不切实际,或者是否有方法加载特定索引内容,可能使用lseek来定位正确的文件位置

我只包括与哈希表初始化相关的代码,但是如果需要更多,请告诉我。提前感谢:

#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只初始化结构中每个数组的前两个元素。其余的被随机垃圾字节填充。