C++ 将哈希表写入文件并从C+中的文件还原+;

C++ 将哈希表写入文件并从C+中的文件还原+;,c++,hashtable,C++,Hashtable,我正在为学校做作业,在结构程序中使用哈希表。分配的一部分是将一个由20个主存储桶和10个溢出存储桶组成的哈希表写入磁盘,每个存储桶有3个由密钥和数据字段组成的插槽,然后从磁盘恢复。以下是我到目前为止的情况: #include <iostream> #include <fstream> #include <iomanip> #include <stdio.h> #include <string.h> // for strcpy() us

我正在为学校做作业,在结构程序中使用哈希表。分配的一部分是将一个由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;
            }
        }
    }
}
#包括
#包括
#包括
#包括
#包含//用于strcpy()
使用名称空间std;
typedef char STR10[10+1];
typedef char STR20[20+1];
结构槽
{
STR10键;
STR20数据;
};
结构桶
{
插槽入口[3];
整数计数;
铲斗*溢流;
};
结构哈希表
{
斗式pBkt[20];
铲斗oBkt[10];
};
void writehtodisk(哈希表ht,char*HashDisk);
void ReportHT(哈希表ht,char*when);
int main()
{
int maxP=20;
int maxO=10;
int max=3;
哈希表ht;
STR10-mKey;
STR20-mData;
文件*填充;
infle=fopen(“数据输入数据”,“rb”);
if(infle==NULL)
{

CUT< P>看起来你的代码不初始化,甚至使用成员<代码>计数>代码>当哈希桶为空时,<代码>计数>代码>应该指示它。在C++中,很容易实现:只需添加<代码>=0 < /代码>,以定义:

struct BUCKET
{
  SLOT entry[3];
  int count = 0;
  BUCKET* overflow;
};
此外,在将bucket的数据写入文件时,请使用count,不要假设bucket中的所有条目都已填充

        for (int j = 0; j < ht.pBkt[i].count; j++)
            ...

顺便说一下,由于您有一个
STR10
类型,因此可以避免使用幻数并编写
sizeof(STR10)而不是<代码> 11 < /代码>。这样,当您更改字符串的长度时,代码仍然有效。

< P>看起来您的代码不初始化或使用成员<代码>计数<代码>。当哈希桶为空时,<代码>计数<代码>应该指示它。在C++中,很容易实现:只需添加<代码>=0 < /代码>到它的防御。声明:

struct BUCKET
{
  SLOT entry[3];
  int count = 0;
  BUCKET* overflow;
};
此外,在将bucket的数据写入文件时,请使用count,不要假设bucket中的所有条目都已填充

        for (int j = 0; j < ht.pBkt[i].count; j++)
            ...

顺便说一下,由于您有一个
STR10
类型,因此可以避免使用幻数并编写
sizeof(STR10)
而不是
11
。这样,当你更改字符串长度时,你的代码仍然可以工作。

试着做一个a,在你的问题中发布它,而不是发布部分代码。确保问题可以重现。别忘了写下你期望的输出。这样做可能会导致你找到解决方案。如果不行,你的问题就解决了stion,所以它成为可回答的。我应该添加原始文本文件吗?我还可以做些什么来澄清?我需要包括我想要阅读的文本文件吗?对不起,我是这个网站的新手。除其他外,意味着“复制的最小示例”。您可以按照此链接阅读人们对您的示例的期望。我看到您添加了整个程序;这比部分好,但最好是将示例最小化!想象一下,人们会问:“问题代码在哪里?是在
插入目录中还是在
写入目录中?”是你回答了这个问题(问题在哪里)自己使用消除法。将代码减少到最少。在开始删除不相关的代码之前,不要忘记进行备份。我认为我已将其减少到足以说明问题所在。示例中的聚集文本可以放入.dat文件并运行。我不确定如何附加全文文件。请尝试创建一个在你的问题中,不要发布部分代码。确保问题可以重现。别忘了写下你期望的输出。这样做可能会导致你找到解决方案。如果没有,你的问题,因此它是可以回答的。我应该添加原始文本文件吗?我还可以做些什么来澄清?我需要包括文本文件吗e我想从中阅读?对不起,我是这个网站的新手。除其他外,这意味着“复制的最小示例”。你可以通过此链接阅读人们对你的示例的期望。我看到你添加了整个程序;这比部分更好,但更好的是将你的示例最小化!想象人们在想:“有问题的代码在哪里?是在
insertintotht
中还是在
writehtodisk
中?”在“minimal”中的意思是回答这个问题(问题在哪里)自己使用消除法。将代码减少到最少。在开始删除不相关的代码之前,不要忘记备份。我认为我已经将其减少到足以说明问题所在。示例中的聚集文本可以放入.dat文件中并运行。我不确定如何附加全文文件。它仍然给出了same错误。当我在完整程序中运行带有编辑的代码时,它突然停止工作。它仍然给出相同的错误。当我在完整程序中运行带有编辑的代码时,它突然停止工作。