C++ 使用C++;在Linux中不起作用
我使用了以下代码C++ 使用C++;在Linux中不起作用,c++,ubuntu-14.04,C++,Ubuntu 14.04,我使用了以下代码 dp = opendir( dir.c_str() ); while ((dirp = readdir( dp ))) { filepath = dir + "/" + dirp->d_name; } 但是dirp->d_name值如下所示 .\000\000\000\004\324E\020\000\000\000\000\000\324+^S\361Tf\030\000\004..\000\000\004\237X\n\000\000\000\000\00
dp = opendir( dir.c_str() );
while ((dirp = readdir( dp )))
{
filepath = dir + "/" + dirp->d_name;
}
但是dirp->d_name
值如下所示
.\000\000\000\004\324E\020\000\000\000\000\000\324+^S\361Tf\030\000\004..\000\000\004\237X\n\000\000\000\000\000fJ\035\224\321M\264l(\000\bFontTest1.pdf\000\000\000\000\000\000\b\236X\n\000\000\000\000\000\377\377\377\377\177(\000\bproject\u report.pdf\000\bproject\b000\bj\bj
最好的跨平台方法是使用该库。不幸的是,目前这仍然是一个技术规范,因此您需要使用Boost版本的该库或:
experimental/filesystem
一旦您有了文件系统
,尽管您可以简单地使用:
copy(目录迭代器(dir),目录迭代器(),ostream迭代器(cout,“\n”))
这个例子可能有点复杂。如果我能为你澄清一些事情,请让我知道
在Visual Studio 2015中,如果您只是#include
并使用名称空间tr2::sys执行,则此代码将运行。不幸的是,gcc 5.3尚未实现目录迭代器。运算符++()
,因此您需要在那里进行增强,否则将出现以下错误:
对std::experimental::filesystem::v1::\uuuCXX11::directory\u iterator::operator++()
您是否可能错误地处理了“.”和“.”目录?(每个目录都有它们)
我以以下方式排除了他们:
std::string fn(ent->dname);
if(fn == ".") { if(dbg2) { std::cout << "S_DOT" << std::endl; } continue;}
if(fn == "..") { if(dbg2) { std::cout << "D_DOT" << std::endl; } continue;}
“continue”跳转到循环处理dirent条目的开头。谢谢大家。我可以通过添加以下代码对其进行排序。
无符号字符isFile=0x8;
if(dirp->d_type==isFile)
//处理它您是否检查了dp
的值?请提供一个,以便其他人可以复制此问题显示相关名称的声明。“。\0”对于某些版本的格式化/呈现,似乎作为当前目录的C“字符串”有效。我正在尝试在Ubuntu的/pdftestcases中打开/home/mjc_。在这种情况下,dirp->d_name显示所有文件名介于一些垃圾字符之间。理想情况下,它应该一次显示一个文件名,而不显示任何垃圾字符。
std::string fn(ent->dname);
if(fn == ".") { if(dbg2) { std::cout << "S_DOT" << std::endl; } continue;}
if(fn == "..") { if(dbg2) { std::cout << "D_DOT" << std::endl; } continue;}
switch(ent->d_type)
{
case DT_UNKNOWN: {...}
case DT_DIR: {...}
// ... etc
}