Создание собственной структуры итератора для работы с cstdio

Я пытаюсь создать итератор, чтобы просмотреть мой файл. Мой файл является двоичным и имеет значения 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 ;
        }
        */
    };

};

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, так далее.

Однако, это сломается, если вы создадите несколько итераторов и ожидаете, что они будут указывать на разные места в файле, потому что при таком подходе все они используют один дескриптор файла и, следовательно, одну позицию в этом файле. Вы можете заставить каждый итератор отслеживать свою позицию и искать ее перед каждой операцией (не поточно-ориентированной) или дублировать дескриптор файла для каждого итератора (потребляет дополнительный файловый дескриптор для каждого итератора).

Или, может быть, гораздо проще просто отобразить файл в памяти и использовать указатели в сопоставленном адресном пространстве в качестве итераторов.

Другие вопросы по тегам