如何用C++递归地从二进制文件中读取自定义字符串

How to read custom string with C++ from binary recursively

本文关键字:读取 自定义 字符串 二进制文件 何用 C++ 递归      更新时间:2023-10-16

我最近开始使用C++进行IO。我正在尝试从二进制文件流中读取一个字符串。

自定义类型保存如下:

字符串的前缀是字符串的长度。所以hello,会像这样存储:6Hello\0。

我基本上是从二进制文件中的表(在本例中是名称表)中读取文本。文件头告诉我这个表的偏移量(在这种情况下是112字节)和名称的数目(318)。

使用这些信息,我可以读取这个偏移量的第一个字节。这告诉我字符串的长度(例如6)。所以我将从下一个字节开始,再读5个字节,得到完整的字符串"Hello"。这似乎与偏移处的第一个名称配合得很好。尝试递归地读取其余部分确实提供了大量垃圾。我试过使用循环和递归函数,但效果不太好。不确定问题是什么,所以恢复到原来的一个名称检索方法。这是代码:

int printName(fstream& fileObj, __int8 buff, DWORD offset, int& iteration){
    fileObj.seekg(offset);
    fileObj.read((char*)&buff, sizeof(char));
    int nameSize = (int)buff;
    char* szName = new char[nameSize];
    for(int i=1; i <= nameSize; i++){
        fileObj.seekg(offset+i);
        fileObj.read((char*)&szName[i-1], sizeof(char));
    }
    cout << szName << endl;
    return 0;
}

知道如何迭代所有318个名称而不产生不可靠的输出吗?感谢您花时间仔细阅读,非常感谢您的帮助。

您有点过于复杂了-不需要查找下一个顺序读取。

删除未使用和毫无意义的参数,我会写这样的函数:

void printName(fstream& fileObj, DWORD offset) {
    char size = 0;
    if (fileObj.seekg(offset) && fileObj.read(&size, sizeof(char)))
    {
        char* name = new char[size];
        if (fileObj.read(name, size))
        {
            cout << name << endl;
        }
        delete [] name;
    }
}