2017-09-19 4 views
1

J'essaie de créer un itérateur pour parcourir mon fichier. Mon fichier est binaire et contient des valeurs int, donc à mon point de vue, cela devrait fonctionner comme ça. Mais je reçois des erreurs dit "utilisation invalide de membre de données" IntFile :: fichier "" Donc je ai marqué dans le code où je reçois des erreurs. Comment puis-je le gérer?Création d'une structure d'itérateur personnalisée pour travailler avec cstdio

#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 ; 
     } 
     */ 
    }; 

}; 
+0

peut-être lié: https://stackoverflow.com/questions/46243549/going-through-file-using-iterators – NathanOliver

+0

@NathanOliver pas exactement –

+1

'iterator' n'a pas de membre de données nommé' file'. Le fait qu'il soit imbriqué dans 'IntFile' ne lui donne pas de connexion avec un objet' IntFile'. De plus, 'fseek' s'applique à l'objet ** FILE *' ** courant, pas au fichier sous-jacent. Ouvrir un fichier, le chercher et le fermer n'a aucun effet. –

Répondre

1

Je reçois des erreurs, dit « utilisation invalide des données membres « IntFile :: file » »

IntFile::iterator ne dispose pas d'un membre de données file, n'a pas non plus implicitement une référence à une instance de IntFile (comme ce serait le cas dans, disons, Java).

IntFile::iterator a besoin d'une référence à IntFile pour pouvoir utiliser cet élément de données:

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

    // Your other code 

private: 
    IntFile &file; 
}; 

Ensuite, vous serez en mesure d'accéder file.file, file.index, etc.

Cependant, cela va se décomposer si vous créez plusieurs itérateurs et attendez qu'ils pointent vers des endroits différents dans le fichier, car avec cette approche, ils partagent tous un seul handle de fichier, et donc une seule position dans ce fichier. Vous pouvez demander à chaque itérateur de garder une trace de sa propre position et y chercher avant chaque opération (pas de thread sécurisé) ou vous pouvez dupliquer le handle de fichier pour chaque itérateur (consomme un descripteur de fichier supplémentaire par itérateur).

Ou, il peut être beaucoup plus facile de simplement mapper la mémoire du fichier et d'utiliser un pointeur dans l'espace d'adresses mappé comme vos itérateurs.

+0

@cdhowe, désolé n'a pas eu le temps de répondre plus tôt. Je l'ai fait comme vous l'avez dit, mais maintenant je ne peux pas utiliser ce "fichier = fopen (" text.txt "," r + b ");" à cause de différents types d'opérandes. Avez-vous une idée de comment je peux le changer? –

+0

@IvanovIvan Afficher votre nouveau code. – cdhowie