Я пытаюсь создать итератор, чтобы просмотреть мой файл. Мой файл является двоичным и имеет значения 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 ;
}
*/
};
};
Я получаю сообщение об ошибке «неверное использование элемента данных ‘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
, так далее.
Однако, это сломается, если вы создадите несколько итераторов и ожидаете, что они будут указывать на разные места в файле, потому что при таком подходе все они используют один дескриптор файла и, следовательно, одну позицию в этом файле. Вы можете заставить каждый итератор отслеживать свою позицию и искать ее перед каждой операцией (не поточно-ориентированной) или дублировать дескриптор файла для каждого итератора (потребляет дополнительный файловый дескриптор для каждого итератора).
Или, может быть, гораздо проще просто отобразить файл в памяти и использовать указатели в сопоставленном адресном пространстве в качестве итераторов.
Других решений пока нет …