2015-06-19 12 views
5

Các chương trình sau đây sẽ cho kết quả khác nhau khi thực hiện từ CodeBlocks và từ cmd -:đầu ra khác nhau khi thực hiện từ cmd và CodeBlocks

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

Kết quả từ CodeBlocks sau khi chạy nó từ bên trong IDE -:

output = 0 !!! 

Kết quả từ cmd bằng cách thực thi boost1 sau khi thay đổi thư mục hiện tại thành thư mục chứa tệp thực thi (đường dẫn source được đề cập trong mã) -:

output = 1 !!! 

Theo tôi, đầu ra được đưa ra bởi CodeBlocks phải là chính xác.

Tôi đang chạy chương trình này trên Windows 7 SP1 64 bit và CodeBlocks 13.12.
Tôi đang sử dụng TDM-GCC 4.9.2 (32-bit) và Boost 1.57 để xây dựng chương trình này.

Đầu ra sai từ cmd chỉ xuất hiện nếu tôi thực thi chương trình sau khi thay đổi thư mục hiện tại thành thư mục chứa tệp thực thi.
Nếu tôi giữ thư mục hiện tại của cmd vào một thư mục khác, đầu ra chính xác sẽ được hiển thị.

EDIT -:

Vấn đề ban đầu tôi đã cố gắng để giải quyết là để kiểm tra xem một tập tin/thư mục là một hậu duệ của một thư mục khác hay không.
Đối với việc hoàn thành đó, tôi thực hiện đoạn mã sau -:

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

Bây giờ, nếu tôi thực hiện mã với argv[1]="D:\anmol\coding\c++\boost\boost1\bin\release"argv[2]="D:\anmol\coding\c++\boost\boost1\bin", nó sẽ quay trở lại true, khi nó cần phải có trở false để thay thế. (Kể từ khi, trong trường hợp này, parent thực sự là hậu duệ của descendant)

Lý do cho điều này là trong vòng lặp while trong HeightDiff(), sau một số lần lặp lại, descendant sẽ mang giá trị D:. Do đó, equivalent() sẽ trả về true và dừng vòng một bước trước khi descendant trở thành một chuỗi rỗng.

Tôi không biết trước đó rằng D: đề cập đến thư mục hiện tại và do đó đã hỏi câu hỏi này.

Có cách nào để sửa đổi chức năng HeightDiff sao cho nó cung cấp đầu ra chính xác không?

Sẽ thay thế các điều kiện equivalent() với while(descendant != parent) cho đầu ra chính xác trên tất cả các trường hợp?

Nếu không, thì có giải pháp nào khác không?

+0

có vẻ như CodeBlocks không đặt thư mục hiện tại nơi tệp nhị phân. Hãy thử sử dụng chức năng win32 GetCurrentDirectory' để kiểm tra vị trí của thư mục hiện tại. – durkmurder

+0

Thư mục hiện tại mà CodeBlocks đặt là - 'D: \ anmol \ coding \ C++ \ boost \ boost1', có thể là do thư mục chính của dự án. Dù sao, kể từ khi tôi nhập vào đường dẫn đầy đủ bên trong mã của tôi, tại sao nó quan trọng những gì các thư mục hiện hành là? –

+1

Bạn đang cố gắng giải quyết vấn đề gì với chương trình của mình? Các thư mục hiện tại quan trọng vì D: (không có dấu gạch chéo ở cuối) giải quyết vào thư mục hiện tại trên ổ D. Vì vậy, tương đương() trả về true nếu "nguồn" chứa thư mục hiện tại trên ổ đĩa D:. –

Trả lời

2

Sau khi thay thế các điều kiện equivalent với while(descendant != parent), chương trình hoạt động chính xác.

0

Chỉ cần thay thế

equivalent(source, "D:") 

với

equivalent(source, "D:\\") 

và bạn sẽ nhận được kết quả mong đợi: dấu gạch chéo sau D: (theo đề nghị của Serge Rogatch) sẽ làm cho các chuỗi tham khảo các thư mục gốc.

+0

Điều này không trả lời được câu hỏi của tôi. –

Các vấn đề liên quan