gpt4 book ai didi

c++ - 在 C++ 中将哈希表写入文件并从文件恢复

转载 作者:行者123 更新时间:2023-12-02 10:35:49 24 4
gpt4 key购买 nike

我正在使用结构程序中的哈希表为学校分配作业。部分任务是编写一个由 20 个主存储桶和 10 个溢出存储桶组成的哈希表,每个存储桶有 3 个由键和数据字段组成的槽,然后从磁盘中恢复。这是我到目前为止所拥有的:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <string.h> // for strcpy()

using namespace std;

typedef char STR10[10+1];
typedef char STR20[20+1];

struct SLOT
{
STR10 key;
STR20 data;
};

struct BUCKET
{
SLOT entry[3];
int count;
BUCKET* overflow;
};

struct HASHTABLE
{
BUCKET pBkt[20];
BUCKET oBkt[10];
};

void WriteHTtoDisk (HASHTABLE ht, char *HashDisk);
void ReportHT (HASHTABLE ht, char * when);

int main()
{
int maxP = 20;
int maxO = 10;
int maxS = 3;
HASHTABLE ht;

STR10 mKey;
STR20 mData;

FILE * inFile;
inFile = fopen("DATAIN.dat","rb");
if (inFile == NULL)
{
cout << " DATAIN file access error ... \n";
cout << " Terminating application ... \n ";
cout << " Press any key ... \n ";
return -100;
}
char crLF;

while (!feof(inFile))
{
fscanf(inFile,"%10c%20c\n",mKey,mData);
mKey[10] = mData[20] = 0; // add string terminators
printf(" MyKey: %10s\n MyData: %20s\n",mKey,mData);
cin.ignore(80,'\n'), cin.get();
//InsertIntoHT (ht, mKey, mData);
}

fclose(inFile);

WriteHTtoDisk(ht, "hashTable.dat");
ReportHT (ht,"BEFORE");

return 0;
}

void WriteHTtoDisk (HASHTABLE ht, char *HashDisk)
{
FILE * HASHDISK = fopen(HashDisk, "rb");
int maxBkt = 30;
int maxSlot = 3;

for (int i = 0; i < maxBkt; i++)
{
for (int j = 0; j < maxSlot; j++)
{
fwrite(ht.pBkt[i].entry[j].key,11,sizeof(maxSlot),HASHDISK);
fwrite(ht.pBkt[i].entry[j].data,21,sizeof(maxSlot),HASHDISK);
}

}
}

void ReportHT (HASHTABLE ht, char * when)
{
int maxB = 30;
int maxS = 3;
cout << "Hash Table \n" << "Verification Report \n" << when << " Restoration" << endl;

for (int b = 0; b < maxB; b++)
{
cout << "Bucket " << (b+1) << endl;

if (b < 20)
{
for (int i = 0; i < maxS; i++)
{
cout << setw(3) << "Slot " << (i+1) << ": " << ht.pBkt[b].entry[i].key << setw(3) << ht.pBkt[b].entry[i].data << endl;
}
}

else
{
for (int i = 0; i < maxS; i++)
{
cout << setw(3) << "Slot " << (i+1) << ": " << ht.oBkt[b].entry[i].key << setw(3) << ht.oBkt[b].entry[i].data << endl;
}
}
}
}

代码编译没有问题,但是当我检查文件时,我发现它只是乱码和奇怪的符号。我使用的数据以前是从另一个文件中提取的,我想以插入它的格式保存它。我确信问题出在 fwrite 的行上(我对 C 语法的经验不像对 C++ 那样有经验)。

数据位于 DATAIN.dat 文件中,如下所示:

大同CO.EL PR。加利福尼亚长滩
KAMERMAN LCIRRUS 比弗顿,或
QUADRAM COLOACH AV NORCROSS GE
AST RESEARALTON AV 欧文 CA

我希望新文件看起来像这样:

大同公司
埃尔公关。加利福尼亚长滩

卡默曼 L
卷云比弗顿,或

QUADRAM公司
泥鳅 AV NOCROSS GE

AST研究
奥尔顿 AV 欧文 CA

任何帮助将不胜感激。谢谢你。

最佳答案

看起来您的代码没有初始化,甚至没有使用成员 count .当哈希桶为空时,count应该指出它。在 C++ 中很容易实现:只需添加 = 0对其定义:

struct BUCKET
{
SLOT entry[3];
int count = 0;
BUCKET* overflow;
};

此外,在将存储桶的数据写入文件时,请使用计数,不要假设存储桶中的所有条目都已填满。
        for (int j = 0; j < ht.pBkt[i].count; j++)
...

此外,仅写入所需的字节数。 fwrite接受两个参数:要写入的数据元素的大小及其数量。这里,大小为 11 或 21,个数为 1,因为每个 fwrite call 只能将一个字符串写入您的文件。
            fwrite(ht.pBkt[i].entry[j].key,11,1,HASHDISK);
fwrite(ht.pBkt[i].entry[j].data,21,1,HASHDISK);

顺便说一句,既然你有一个 STR10类型,你可以避免魔数(Magic Number)并写 sizeof(STR10)而不是 11 .这样,当您更改字符串的长度时,您的代码仍然可以工作。

关于c++ - 在 C++ 中将哈希表写入文件并从文件恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60367349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com