创建自定义迭代器结构以使用 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.file
、file.index
等
但是,如果您创建多个迭代器并期望它们指向文件中的不同位置,这将会崩溃,因为使用这种方法它们都共享一个文件句柄,因此共享该文件中的一个位置。您可以让每个迭代器跟踪它自己的位置并在每个操作之前寻找它(不是线程安全的),或者您可以为每个迭代器复制文件句柄(每个迭代器消耗一个额外的文件描述符)。
或者,只对文件进行内存映射并使用指向映射地址的指针 space 作为迭代器可能会容易得多。
我正在尝试创建一个迭代器来遍历我的文件。我的文件是二进制的,里面有 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.file
、file.index
等
但是,如果您创建多个迭代器并期望它们指向文件中的不同位置,这将会崩溃,因为使用这种方法它们都共享一个文件句柄,因此共享该文件中的一个位置。您可以让每个迭代器跟踪它自己的位置并在每个操作之前寻找它(不是线程安全的),或者您可以为每个迭代器复制文件句柄(每个迭代器消耗一个额外的文件描述符)。
或者,只对文件进行内存映射并使用指向映射地址的指针 space 作为迭代器可能会容易得多。