0

好的,所以我正在尝试从二进制文件中读取输入。我已经稍微更改了这段代码,但是在这个版本中,我遇到了访问冲突错误......所以它试图访问不存在的东西。这是我的问题区域的源代码:

void HashFile::fileDump (ostream &log)
{
    HashNode *temp = new HashNode;

    fstream bin_file;
    bin_file.open ("storage_file.bin", ios::in | ios::binary);  

    for(int i = 0; i < table_size; i++)
    {
        bin_file.seekg( i * sizeof(HashNode) );

        bin_file.read( (char *)&temp, sizeof(HashNode) );

        printDump(HashNode(temp->title, temp->artist, temp->type, temp->year,
        temp->price), log, i);
    }

    bin_file.close();
}

void HashFile::printDump(HashNode A, ostream &log, int N)
{
    log << "(" << N << ") " << A.title << ", " << A.artist
        << ", " << A.type << ", " << A.year << ", $"
        << setprecision(2) << A.price << endl;
}

我知道我应该进行某种错误检查。现在错误发生在 printDump 函数中。每当我尝试输出到日志时,我都会收到访问冲突错误。但是,我将日志更改为 cout,我的代码将运行良好。它将读取我正确创建的二进制文件,直到它到达最后一个元素。对于我一直在测试的内容,table_size 应该等于 5。所以我进入 for 循环,并且 i 递增,直到它达到 5,然后它继续运行。table_size 正在更改为某个随机值,即使我没有实际接触过它。我是否以某种方式在内存中写入了 table_size 的地址?

这是我的节点的定义:

class HashNode
{
    public:
        HashNode();
        ~HashNode();
        HashNode(string title, string artist, string type, int year, float price);
        friend class HashFile;
    private:
        char title [35];
        char artist [25];
        char type [12];
        int year;
        float price;
};
4

1 回答 1

0

这个

bin_file.read( (char *)&temp, sizeof(HashNode) );

应该是这个

bin_file.read( (char *)temp, sizeof(HashNode) );

你对指针感到困惑。

该代码是否真正起作用在很大程度上取决于Node您未显示的定义。

此外,由于 temp 永远不会被删除,因此代码会泄漏内存。最好不要分配 temp ,像这样

void HashFile::fileDump (ostream &log)
{
    HashNode temp;

    fstream bin_file("storage_file.bin", ios::in | ios::binary);  

    for(int i = 0; i < table_size; i++)
    {
        bin_file.seekg( i * sizeof(HashNode) );

        bin_file.read( (char *)&temp, sizeof(HashNode) );

        printDump(HashNode(temp.title, temp.artist, temp.type, temp.year, temp.price), log, i);
    }
}

不清楚为什么你觉得需要创建一个新节点temp,为什么不直接将 temp 传递给printDump?像这样

        printDump(temp, log, i);

但是如果没有看到 Node 的定义,我不能肯定地说。

也不需要关闭文件,这是自动发生的,在构造函数中打开文件也更干净一点恕我直言。

编辑

好的,看到这个的定义Node是我的建议

void HashFile::fileDump(ostream &log)
{
    fstream bin_file("storage_file.bin", ios::in | ios::binary);  
    for(int i = 0; i < table_size; i++)
    {
        bin_file.seekg(i * sizeof(HashNode));    
        HashNode temp;
        bin_file.read((char *)&temp, sizeof(HashNode));
        printDump(temp, log, i);
    }
}

此外,我会将 printDump 更改为使用 const 引用,这样可以避免复制Node对象(它很大)。

void HashFile::printDump(const HashNode& A, ostream &log, int N)
{
    log << "(" << N << ") " << A.title << ", " << A.artist
        << ", " << A.type << ", " << A.year << ", $"
        << setprecision(2) << A.price << endl;
}
于 2013-05-04T13:23:08.600 回答