1

我正在尝试创建一个迭代器来遍历我的文件。我的文件是二进制文件,里面有 int 值,所以在我看来,它应该是这样工作的。但是我收到错误说“无效使用数据成员'IntFile :: file'”所以我在代码中标记了我遇到错误的地方。我该如何管理它?

#include <iostream>
#include <cstdio>


using namespace std;


class IntFile
{
public:
    int index;
    FILE* file;         // Error here
    IntFile() {}
    ~IntFile() {}
    int mnumbers[10];
    int mnumbers2[10];
    int value;

  // And this whole class does not work
    class iterator
    {
        bool operator ++ ()
        {
            file = fopen ("text.txt", "r+b");
            fseek (file, 4*index, SEEK_CUR);
            fclose(file);
        }
        bool operator -- ()
        {
            file = fopen ("text.txt", "r+b");
            fseek (file, (-4)*index, SEEK_CUR);
            fclose(file);
        }
        /*
        iterator begin()
        {
            return ;
        }
        iterator end()
        {
            return ;
        }
        */
    };

};
4

1 回答 1

1

我收到错误消息“无效使用数据成员'IntFile::file'”

IntFile::iterator没有数据成员file,也没有隐式引用 的实例IntFile(例如,Java 中的情况)。

IntFile::iterator需要引用才能IntFile使用该数据成员:

class iterator
{
    explicit iterator(IntFile &file) : file(file) {}

    // Your other code

private:
    IntFile &file;
};

然后您将能够访问file.file,file.index等。

但是,如果您创建多个迭代器并期望它们指向文件中的不同位置,这将失败,因为使用这种方法它们都共享一个文件句柄,因此在该文件中共享一个位置。您可以让每个迭代器跟踪自己的位置并在每次操作之前在那里寻找(不是线程安全的),或者您可以为每个迭代器复制文件句柄(每个迭代器消耗一个额外的文件描述符)。

或者,仅对文件进行内存映射并使用指向映射地址空间的指针作为迭代器可能会容易得多。

于 2017-09-19T15:47:46.023 回答