2017-10-10 2 views
0

Also leitete ich eine Klasse von struct dirent ab. Dies ist, was meine abgeleiteten Klasse-Header wie folgt aussehen: #ifndef Direntry_hpp #define Direntry_hppWie leite ich eine Klasse von struct dirent ab und verwende sie, um das Ergebnis von readdir() zu speichern?

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

So In meinem Code ich versuche, readdir() zu verwenden und mein ein Klassenobjekt der oben genannten Klasse zu speichern. Also liefert readdir() struct dirent * zurück. Ich habe alles versucht, aber ich kann mein Klassenobjekt nicht verwenden, um die Ergebnisse von readdir() zu speichern.

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"); 
    } 
} 

So wird, dass Stat-Klasse abgeleitet aus und es funktioniert, aber aus irgendeinem Grund dirent Struktur ist so, wie ich es zu antizipieren, nicht funktionieren. Was habe ich falsch gemacht oder versuche ich etwas zu tun, was nicht getan werden sollte?

Edit:

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

Der obige Code einen Fehler bei der Kompilierung erzeugt, der sagt:
Zuordnung zu 'DirEntry *' von inkompatiblen Typ 'struct dirent *'

+0

"irgendein Grund struct dirent funktioniert nicht so, wie ich es vorschlage" -> Wie ist es gescheitert - Ausgabe anzeigen? Was wurde erwartet? – chux

+1

Hoffe, dieser Code ist nur für das Studium und wird nicht woanders verwendet werden ... – 0x0C4

+0

Ja das ist rein zum Studium des UNIX-Dateisystems –

Antwort

0
DIR* dir = opendir(path);  

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

So fand ich heraus, dass Sie den Rückgabewert von readdir() von struct dirent * in Direntry * umwandeln können. Dies ist die Klasse, die von struct dirent

abgeleitet wird
+1

Beachten Sie, dass dies nur funktioniert, solange Ihr eigenes Directory-Objekt nicht sein eigenes enthält Mitgliedsvariablen oder haben Sie virtuelle Methoden. – nos

Verwandte Themen