2016-08-21 3 views
-4

Ich mache ein Programm, um Verzeichnis und Benutzer Ordner Namen zu sammeln, bedenken Sie, dass ich dies als ein Hobby mache, obwohl ich Informatik nächstes Jahr nehmen könnte, wenn ich Glück habe.Directory lister Programm ist fehlerhaft, C++

Sprache: C++

IDE: Code-Blöcke

Problem: Es wird angenommen, eine Textdatei mit einer Liste von Dateien in den Verzeichnissen unten zu schaffen, aber wenn ich es laufen, tut es nicht, dass Was es macht, ist nichts.

Code:

void directory_lister() // List folders in respective directories. 
{ 
    string dir_hos = " "; 
    int cycle = 0; 
    string dir_program = "C:\\Program Files\\"; 
    string dir_program32 = "C:\\Program Files (x86)\\"; 
    string dir_users = "C:\\Users\\"; 

    while (cycle < 3){ 

     if(dir_hos != dir_program){ 
      dir_hos = dir_program; 
      cycle++; 

      DIR *dir = NULL; 
      struct dirent *drnt = NULL; 
      opendir(dir_hos.c_str()); 

      while((drnt = readdir(dir))) // Faulty code #1. 
      { 
       w_file("directorylist.txt",drnt->d_name); 
      } 
      closedir(dir); 

      cout << cycle; 
     }else if(dir_hos != dir_program32){ 
      dir_hos = dir_program32; 
      cycle++; 

      DIR *dir = NULL; 
      struct dirent *drnt = NULL; 
      opendir(dir_hos.c_str()); 

      while((drnt = readdir(dir))) // Faulty code #2. 
      { 
       w_file("directorylist.txt",drnt->d_name); 
      } 
      closedir(dir); 

      cout << cycle; 
     }else if(dir_hos == dir_users){ 
      dir_hos = dir_users; 
      cycle++; 

      DIR *dir = NULL; 
      struct dirent *drnt = NULL; 
      opendir(dir_hos.c_str()); 

      while((drnt = readdir(dir))) // Faulty code #3. 
      { 
       w_file("directorylist.txt",drnt->d_name); 
      } 
      closedir(dir); 

      cout << cycle; 
     } 

    } 

    return; 
} 

int main(){ 
    directory_lister(); 
    return 0; 
} 

Auch w_file Funktion ist folgende:

void w_file(string filename_s, char * content) 
{ 
    // Change string to const char * 
    const char * filename_cc = filename_s.c_str(); 

    // Writing File Code 
    ofstream file; 
    file.open(filename_cc,ios::app); 
    file << content << endl; 
    file.close(); 
    return; 
} 

Compiler output:

Prozess mit Status beendet 0 (0 Minute (n), 1 Sekunde (s)) 0 Fehler (s), 0 Warnung (en) (0 Minute (n), 1 Sekunde (n))


Fehlerhafte Code # 1, # 2, # 3:

Vor diesem ich nicht zusätzliche Klammern haben, zB während (drnt = readdir (dir)), aber der Compiler gibt mir 3 Warnung über nicht genug Klammern (erfolgreich kompiliert, aber nicht funktioniert), also füge ich sie hinzu, aber es funktioniert immer noch nicht.

Ich habe auch versucht mit "==" anstelle von "=", aber es hanged das Programm und es stürzte ab. Bevor es abstürzte, gelang es, "directories.txt" zu machen.


Andere:

Ich denke, es andere Codes, die ich nicht richtig geschrieben, aber ich kann es nicht herausfinden, da ich bei der Programmierung schlecht bin. Können Sie mir helfen, es zu reparieren? Ich bin sicher, ich werde etwas daraus lernen. Vielen Dank!


Auf einer anderen Anmerkung:

Ich bin nicht besonders gut an dirent.h verwenden, bin jedesmal, wenn ich es benutze ich so verschwimmen, ich die einfachsten (I zu verwenden, in der Regel Beispiele suchen und kopieren bin beschämt, aber ich bin sehr verwirrt beim Lesen der Dokumentation).

+0

Das richtige Werkzeug, um solche Probleme zu lösen, ist, Ihren Debugger zu verwenden, aber nicht bei Stack Overflow zu fragen, bevor Sie dies getan haben. Nennen Sie uns all Ihre Beobachtungen, die Sie gemacht haben, als Sie Ihren Code Schritt für Schritt auf Platz 1 durchgesehen haben. Vielleicht möchten Sie auch lesen ** [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** Zumindest Lass uns mit [MCVE], die dein Problem reproduziert. (Dies ist ein persönlicher Aktienkommentar von πάντα ῥεῖ ™) –

+0

@Spera (1) define "funktioniert nicht", bieten detaillierte Beschreibung des gewünschten Verhaltens vs beobachtetes Verhalten, (2) bieten ein Codebeispiel, das wir kompilieren könnten und/oder run, um das Problem zu reproduzieren (Hinweis: um ein Programm zu erstellen, benötigen Sie die Funktion 'main()'), (3) stellen Sie alle relevanten Konsolenausgaben zur Verfügung, indem Sie es in Ihren Beitrag kopieren (wie es ist, wörtlich, nicht Ihre Interpretation davon)) – Drop

+0

@Drop, Fertig, fertig und fertig. – Spera

Antwort

0

Das an readdir() übergebene Argument soll ein Wert sein, der zuvor von opendir() zurückgegeben wurde - das Bereitstellen eines Null-Zeigers, da Sie einen Fehler verursachen.

Der von opendir() zurückgegebene Wert wird niemals in einer Variablen gespeichert - was bedeutet, dass er sofort verworfen wird und sicher nie an readdir() übergeben wird.

Es ist normalerweise eine gute Idee, die Rückgabewerte von Funktionen zu überprüfen. Beispielsweise gibt opendir() einen Nullzeiger bei Fehler zurück.

Ich habe nicht genau genug untersucht, um festzustellen, ob es noch andere Probleme gibt ... aber die Probleme zu beheben, die ich identifiziert habe, wird für dich sowieso lehrreich sein.

+0

Ah, also ich muss opendir() in dir speichern, dir = opendir(); Vielen Dank, mein Herr. – Spera

+0

Ich werde die Reparatur so schnell wie möglich versuchen Vielen Dank Herr. – Spera

Verwandte Themen