从 cmd 和 Codeblocks 执行时输出不同
Different output when executing from cmd and Codeblocks
以下程序在从 CodeBlocks 和从 cmd 执行时给出不同的结果 -:
#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;
}
CodeBlocks 的输出在 运行 之后来自 IDE -:
output = 0 !!!
将当前目录更改为包含可执行文件的文件夹(代码中提到的 source
路径)后执行 boost1
的 cmd 输出 -:
output = 1 !!!
在我看来,CodeBlocks给出的输出应该是正确的。
我是 运行 这个程序 Windows 7 SP1 64 位和 CodeBlocks 13.12。
我正在使用 TDM-GCC 4.9.2(32 位)和 Boost 1.57 来构建这个程序。
仅当我将当前目录更改为包含可执行文件的文件夹后执行程序时,cmd 才会出现错误输出。
如果我将 cmd 的当前目录保存到其他文件夹,则会显示正确的输出。
编辑-:
我最初试图解决的问题是检查 file/directory 是否是另一个目录的后代。
为此,我实现了以下代码-:
#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;
}
}
现在,如果我用 argv[1]="D:\anmol\coding\c++\boost\boost1\bin\release"
和 argv[2]="D:\anmol\coding\c++\boost\boost1\bin"
执行代码,它会 return true
,而它应该 returned false
代替。 (因为在这种情况下,parent
实际上是 descendant
的后代)
原因是在 HeightDiff()
的 while 循环中,经过一些迭代后,descendant
将取值 D:
。因此,equivalent()
将 return 为真并在 descendant
变为空字符串之前停止循环一步。
之前不知道D:
指的是当前目录,所以问了这个问题。
有什么方法可以修改 HeightDiff
函数以使其提供正确的输出吗?
将 equivalent()
条件替换为 while(descendant != parent)
是否会在所有情况下给出正确的输出?
如果不行,还有其他解决办法吗?
直接替换
equivalent( source, "D:" )
与
equivalent( source, "D:\" )
你应该得到预期的结果:D:
后的斜杠(如 Serge Rogatch 所建议的那样)将使字符串指向根目录。
将 equivalent
条件替换为 while(descendant != parent)
后,程序运行正常。
以下程序在从 CodeBlocks 和从 cmd 执行时给出不同的结果 -:
#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;
}
CodeBlocks 的输出在 运行 之后来自 IDE -:
output = 0 !!!
将当前目录更改为包含可执行文件的文件夹(代码中提到的 source
路径)后执行 boost1
的 cmd 输出 -:
output = 1 !!!
在我看来,CodeBlocks给出的输出应该是正确的。
我是 运行 这个程序 Windows 7 SP1 64 位和 CodeBlocks 13.12。
我正在使用 TDM-GCC 4.9.2(32 位)和 Boost 1.57 来构建这个程序。
仅当我将当前目录更改为包含可执行文件的文件夹后执行程序时,cmd 才会出现错误输出。
如果我将 cmd 的当前目录保存到其他文件夹,则会显示正确的输出。
编辑-:
我最初试图解决的问题是检查 file/directory 是否是另一个目录的后代。
为此,我实现了以下代码-:
#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;
}
}
现在,如果我用 argv[1]="D:\anmol\coding\c++\boost\boost1\bin\release"
和 argv[2]="D:\anmol\coding\c++\boost\boost1\bin"
执行代码,它会 return true
,而它应该 returned false
代替。 (因为在这种情况下,parent
实际上是 descendant
的后代)
原因是在 HeightDiff()
的 while 循环中,经过一些迭代后,descendant
将取值 D:
。因此,equivalent()
将 return 为真并在 descendant
变为空字符串之前停止循环一步。
之前不知道D:
指的是当前目录,所以问了这个问题。
有什么方法可以修改 HeightDiff
函数以使其提供正确的输出吗?
将 equivalent()
条件替换为 while(descendant != parent)
是否会在所有情况下给出正确的输出?
如果不行,还有其他解决办法吗?
直接替换
equivalent( source, "D:" )
与
equivalent( source, "D:\" )
你应该得到预期的结果:D:
后的斜杠(如 Serge Rogatch 所建议的那样)将使字符串指向根目录。
将 equivalent
条件替换为 while(descendant != parent)
后,程序运行正常。