Создание собственной структуры итератора для работы с 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, так далее.

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

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

1

Другие решения

Других решений пока нет …