1

I'm trying to create a iterator to go through my file. My file is binary and have int values inside, so in my point of view, it should work like that. But I'm getting errors says "invalid use of data-member 'IntFile::file' "So i marked in code where I'm getting errors. How can I manage it?

#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 Answers1

1

I'm getting errors says "invalid use of data-member 'IntFile::file'"

IntFile::iterator doesn't have a data member file, nor does it implicitly have a reference to an instance of IntFile (as would be the case in, say, Java).

IntFile::iterator needs a reference to IntFile to be able to use that data member:

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

    // Your other code

private:
    IntFile &file;
};

Then you will be able to access file.file, file.index, etc.

However, this will break down if you create multiple iterators and expect them to point to different places in the file because with this approach they all share a single file handle, and therefore a single position within that file. You can have each iterator keep track of its own position and seek there before each operation (not thread-safe) or you can duplicate the file handle for each iterator (consumes an additional file descriptor per iterator).

Or, it may be much easier to just memory-map the file and use a pointers into the mapped address space as your iterators.

cdhowie
  • 133,716
  • 21
  • 261
  • 264
  • @cdhowe, sorry had no time to reply earlier. I made it how you said, but now i cant use this "file = fopen ("text.txt", "r+b");" because of different operand types. Do you have any idea how i can change it? – Ivanov Ivan Sep 19 '17 at 16:50