2017-10-10 39 views
0

J'ai donc dérivé une classe de struct dirent. C'est ce que ma tête de classe dérivée ressemble: #ifndef Direntry_hpp #define Direntry_hppComment dériver une classe de struct dirent et l'utiliser pour stocker le résultat de readdir()?

#include <dirent.h> 
#include <iostream> 

using namespace std; 

class Direntry : public dirent{ 
private: 
public: 
    void print(ostream&); 
    char* name(){ return d_name; } 
    ino_t inode(){ return d_ino; } 
    unsigned int type(){ return d_type; } 
}; 

#endif /* Direntry_hpp */ 

Alors Dans mon code, j'essaie d'utiliser readdir() et mon un objet de classe de la classe ci-dessus pour le stocker. Donc readdir() renvoie struct dirent *. J'ai tout essayé mais je ne peux pas utiliser mon objet de classe pour stocker les résultats de readdir().

for(;;){ 
    //I want to say Direntry *dirEntry but it doesn't work when I try to store the result of readdir(). 
    struct dirent* dirEntry; 
    if((dirEntry = readdir(dir)) == nullptr) break; 
    if(params.vFlag && dirEntry->d_type != DT_REG){ 
     cout << setw(12) << dirEntry->d_ino << left << dirEntry->d_name << endl; 
    } else if(dirEntry->d_type == DT_REG){ 
     cout << setw(12) << dirEntry->d_ino << left << dirEntry->d_name << endl; 
     Stats stat; //This class is derived from stat in the <sys/stat.h> library and it works. 
     if(lstat(path, &stat)) fatal("lstat error"); 
    } 
} 

Alors que la classe Stat est dérivé de et il fonctionne, mais pour une struct dirent raison ne fonctionne pas la façon dont je prévois à. Qu'est-ce que j'ai fait de mal ou est-ce que j'essaie de faire quelque chose qui ne devrait pas être fait?

Edit:

Direntry* dirEntry; 
if((dirEntry = readdir(dir)) == nullptr) break; 

Le code ci-dessus produit une erreur au moment de la compilation qui dit:
Attribution de 'direntry *' de type incompatible 'struct dirent *'

+0

"une certaine raison struct dirent ne fonctionne pas comme je l'avais prévu" -> Comment a-t-il échoué - afficher la sortie? Qu'est-ce qui était attendu? – chux

+1

Espérons que ce code est pour étudier seulement et ne sera pas utilisé ailleurs ... – 0x0C4

+0

Oui c'est purement pour l'étude du système de fichiers UNIX –

Répondre

0
DIR* dir = opendir(path);  

for(;;){ 
    Direntry* dirEntry; 
    if((dirEntry = (Direntry*)readdir(dir)) == nullptr) break; 
    ... 
} 

Donc, j'ai découvert que vous pouvez convertir la valeur de retour de readdir() de struct dirent * en Direntry * qui est la classe qui dérive de struct dirent

+1

Gardez à l'esprit que cela ne fonctionne que tant que votre propre objet Directory ne contient pas son propre variables membres ou ont des méthodes virtuelles. – nos