我正在使用目录类来获取此信息,但无法将此数据分配给我自己的类的数据成员。我正在做一个oop项目。此外,我想使用动态(包容)的概念。我创建了两个类,mydirectory和myfiles,如下所示:
class files
{
string fname[25];
public:
files()
{
fname=NULL;
}
};
class directory
{ private:
directory *d;
string *dname[25]; //* to show there may be a subdirectory,there may be not.
files *ff[25]; // data member string *fname[25];
int numd,numf;
public:
directory()
{
numd=0;numf=0;
}
现在,如果我想使用该声明:
Directory::GetDirectories("D:\\");
如何将目录名称分配给目录类的“dname”。
我不想包含第三方软件。
我还需要有关该主题的帮助:如何从控制台外的c ++代码打开文件(doc file / pdf / txt / pwt等)?我非常担心。请帮我。提前谢谢。
我是c ++的新手所以请原谅指针处理中是否有任何错误,因为我是第一次做这个包含。我还需要一些阅读材料。
答案 0 :(得分:1)
在C ++中最简单的方法是使用boost :: filesystem。
只要路径是目录,您就可以使用directory_iterator或recursive_directory_iterator对其进行迭代。
例如:
boost::filesystem::path dirname( "D:\\" );
std::vector<boost::filesystem::path> topLevel( directory_iterator(dirName),
directory_iterator() );
std::vector<boost::filesystem::path> wholeDrive(
recursive_directory_iterator(dirName), recursive_directory_iterator() );
答案 1 :(得分:1)
由于这是标记的家庭作业,我们不会通过给你正确的答案来帮助你。但我会指出你正确的方向。
你已经表明你在Visual C ++下这样做了。好吧,如果不使用任何第三方库,只是内置的内容,您将需要访问Win32 API。
FindFirstFile()&amp; FindNextFile()就是您所需要的。
首先调用FindFirstFile以获取目录句柄。 参数是您传递给班级的D:\。
然后在while循环中调用FindNextFile。
e.g。使用这些API的基本原则是
HANDLE h = FindFirstFile("D:\\");
WIN32_FIND_DATA data;
while (FindNextFile(h, &data))
{
// Check if it's a directory or not
if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
// Add to dname
}
}
考虑使用std :: vector作为你的dname而不是string * 因为你被困了25个条目。使用矢量它会为你成长。
答案 2 :(得分:0)
如CashCow所说,boost :: filesystem
作为一般规则,在这些示例的C ++中,您不需要任何指针。在这里你应该纠正一些错误:
string fname[25];
这声明了一个包含25个字符串的数组。你可能想要一串25个字符?好吧,在std :: string中,你不需要关心长度。 std :: string fname;
std::string file_name;
file_name = "baz.txt";
fname=NULL;
如果fname是一个字符串,那么它不是一个指针。所以你不能给它分配NULL。默认情况下,std :: string初始化为空字符串。你可以把整个构造函数都留下来。
string *dname[25]
我想你想要一个字符串数组。只需使用:
std::vector<std::string> dnames;
dnames.push_back("foo");
dnames.push_back("bar"); // dnames now contains {"foo","bar"}
你将拥有一个动态调整大小的字符串向量。
参见:不需要任何指针。不需要任何新的
答案 3 :(得分:0)
最后我完成了短项目。为了得到文件和子目录的列表,我使用了.NET Framework namespace "System"
。它有类似&#34; FileInfo
&#34;和&#34; DirectoryInfo
&#34;(都属于System::IO
)执行上述所需任务。但是,此处所有与字符串相关的内容都是System::String
,而不是std::string
{1}}。要将System::String
转换为std::string
,我使用了以下代码(我从论坛获得了此转换代码,并且工作正常,没有任何错误):
string Str2str(String ^a)
{
array<Byte> ^chars = System::Text::Encoding::ASCII->GetBytes(a);
pin_ptr<Byte> charsPointer = &(chars[0]);
char *nativeCharsPointer = reinterpret_cast<char *>(static_cast<unsigned char *>(charsPointer));
string native(nativeCharsPointer, chars->Length);
return native;
}
这是一个从驱动器获取子目录列表的简短代码(D:将搜索驱动器):
#include<iostream>
#using<mscorlib.dll>
using namespace strd;
using namespace System;
using namespace System::IO;
int main()
{int count=50;
string name[count];//to hold directories names
string b;
int s=0;
DirectoryInfo^ di = gcnew DirectoryInfo("d:\\");
if(di->Exists)
{array<DirectoryInfo^>^diArr = di->GetDirectories();
Collections::IEnumerator^ myEnum = diArr->GetEnumerator();
while ( myEnum->MoveNext() )
{DirectoryInfo^ dri = safe_cast<DirectoryInfo^>(myEnum->Current);
String ^a=(dri->Name->ToString());
int n=b.size();
b=Str2str(a); `// code given in the starting`
if (s<count)
{name[s]=b;
s++;}
}
这涉及托管C ++知识。访问这些:
C++: The Most Powerful Language for .NET Framework Programming
我在Visual Studio 2008上编译了这个。如果你赞美我的努力,我将非常感激。最热烈的建议是最受欢迎的。