2015-06-19 4 views
5

Das folgende Programm gibt unterschiedliche Ergebnisse, wenn sie von Codeblöcken ausgeführt und von cmd -:Verschiedene ausgegeben, wenn von cmd und Codeblöcken Ausführung

#include <iostream> 
#include <string> 
#define BOOST_FILESYSTEM_NO_DEPRECATED 
#include <boost/filesystem.hpp> 

using namespace std; 
using namespace boost::filesystem; 

int main() 
{ 
    // A valid existing folder path on my system. 
    // This is actually the path containing the program's exe. 
    path source = "D:\\anmol\\coding\\c++\\boost\\boost1\\bin\\release"; 

    cout << "output = " << equivalent(source, "D:") << " !!!\n"; 
    return 0; 
} 

Die Ausgabe von Codeblöcken, nachdem es aus der IDE lief -:

output = 0 !!! 

die Ausgabe von cmd durch boost1 ausführt, nachdem das aktuelle Verzeichnis in dem Ordner Ändern der ausführbaren (der Pfad source erwähnt in dem Code) enthalten, -:

012.
output = 1 !!! 

Laut mir sollte die Ausgabe von CodeBlocks die richtige sein.

Ich verwende dieses Programm unter Windows 7 SP1 64-Bit und CodeBlocks 13.12.
Ich verwende TDM-GCC 4.9.2 (32-Bit) und Boost 1.57, um dieses Programm zu erstellen.

Die falsche Ausgabe von cmd kommt nur, wenn ich das Programm nach dem Ändern des aktuellen Verzeichnisses in den Ordner ausführen, der die ausführbare Datei enthält.
Wenn ich das aktuelle Verzeichnis der cmd in einem anderen Ordner belasse, wird die korrekte Ausgabe angezeigt.

EDIT -:

Das ursprüngliche Problem, das ich war zu prüfen, zu lösen versuche, ob eine Datei/Verzeichnis ein Nachkomme von einem anderen Verzeichnis oder nicht.
Für das Erreichen implementierte ich den folgenden Code: -

#include <iostream> 
#include <string> 
#define BOOST_FILESYSTEM_NO_DEPRECATED 
#include <boost/filesystem.hpp> 

using namespace std; 
using namespace boost::filesystem; 

// Returns the difference in height in the filesystem tree, between the directory "parent" and the file/folder "descendant" 
static int HeightDiff(const path parent, path descendant) 
{ 
    int diff = 0; 
    while (!equivalent(descendant, parent)) 
    { 
     descendant = descendant.parent_path(); 
     if (descendant.empty()) 
     { 
      diff = -1; // "descendant" is not a descendant of "parent" 
      break; 
     } 
     diff++; 
    } 
    return diff; 
} 

// Returns true if the file/folder "descendant" is a descendant of the directory "parent" 
static bool IsDescendant(const path parent, path descendant) 
{ 
    return HeightDiff(parent, descendant) >= 1; 
} 

int main(int argc, char** argv) 
{ 
    if (isDescendant(canonical(argv[1]), canonical(argv[2]))) 
    { 
     cerr << "The destination path cannot be a descendant of the source path!! Please provide an alternate destination path !!" << endl; 
    } 
} 

Nun, wenn ich den Code mit argv[1]="D:\anmol\coding\c++\boost\boost1\bin\release" und argv[2]="D:\anmol\coding\c++\boost\boost1\bin" ausgeführt, wäre es true zurückkehren, wenn es false stattdessen zurückgegeben haben sollte. (Da in diesem Fall ist die tatsächlich parent der Nachkomme descendant)

Der Grund dafür ist, dass nach einigen Iterationen in HeightDiff(), während der while-Schleife, um den Wert descendantD: nehmen würde. Folglich gibt equivalent() True zurück und stoppt die Schleife einen Schritt, bevor descendant eine leere Zeichenfolge wird.

Ich wusste nicht vorher, dass D: bezieht sich auf das aktuelle Verzeichnis und daher diese Frage gestellt.

Gibt es eine Möglichkeit, die HeightDiff Funktion zu ändern, so dass es die richtige Ausgabe gibt?

Wird der equivalent() Zustand durch while(descendant != parent) ersetzt, um in allen Fällen eine korrekte Ausgabe zu erhalten?

Wenn nicht, gibt es dann eine andere Lösung?

+0

es scheint, dass Codeblocks nicht das aktuelle Verzeichnis nicht gesetzt, wo die binär ist. Versuchen Sie, die 'GetCurrentDirectory' win32-Funktion zu verwenden, um zu überprüfen, wo das aktuelle Verzeichnis gesetzt ist. – durkmurder

+0

Das aktuelle Verzeichnis, die Sätze Codeblocks ist - 'D: \ anmol \ Codierung \ C++ \ boost \ boost1', wahrscheinlich, weil sein Hauptverzeichnis des Projektes. Wie auch immer, seit ich den vollen Pfad in meinem Code eingebe, warum sollte es dann von Bedeutung sein, was das aktuelle Verzeichnis ist? –

+1

Welches Problem versuchen Sie mit Ihrem Programm zu lösen? Das aktuelle Verzeichnis ist wichtig, weil D: (ohne Schrägstrich am Ende) in das aktuelle Verzeichnis auf Laufwerk löst D. So Äquivalent() liefert true, wenn „Quelle“ auf Laufwerk D das aktuelle Verzeichnis enthält. –

Antwort

2

Nach dem Ersetzen der equivalent Zustand mit while(descendant != parent), wird das Programm ordnungsgemäß funktioniert.

0

Ersetzen Sie einfach

equivalent(source, "D:") 

mit

equivalent(source, "D:\\") 

und Sie sollten die erwarteten Ergebnisse erhalten: den Schrägstrich nach D: (wie von Serge Rogatch) wird die Zeichenfolge beziehen sich auf das Root-Verzeichnis machen.

+0

Das beantwortet meine Frage nicht. –

Verwandte Themen