创建自定义迭代器结构以使用 cstdio

Creating a custom iterator struct to work with cstdio

我正在尝试创建一个迭代器来遍历我的文件。我的文件是二进制的,里面有 int 值,所以在我看来,它应该像那样工作。但是我收到错误说 "invalid use of data-member '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 ;
        }
        */
    };

};

I'm getting errors says "invalid use of data-member '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.filefile.index

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

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