2010-10-09 85 views
0

我需要建立一个文件路径。我有以下类方法:在C++中使用cstrings建立路径的正确方法

void Directory::scanDirectory(char *directory) { 
    DIR *dirp; 
    struct dirent *entry; 
    char path[1]; 

    if(dirp = opendir(directory)) { 
     while(entry = readdir(dirp)) { 
      if (entry->d_name[0] != '.') { 
       strcpy(path, directory); 
       strcat(path, "/"); 
       strcat(path, entry->d_name); 
       if (entry->d_type == 8) { 
        // Files 
       } else if (entry->d_type == 4) { 
        //scanDirectory(path); 
       } 
       printf("Name: %s, Type: %d\n", entry->d_name, entry->d_type); 
      } 
     } 
     closedir(dirp); 
    } 
} 

我需要通过连接目录和entry->d_name建立路径的文件。当我尝试运行这段代码时,它会出现段错误。从我可以告诉它在我建立路径的地方进行分割。有没有更好的方法来做到这一点?

回答

1

缓冲区path需要有足够的空间来保存整个路径。现在它只有一个角色的空间。尝试让它变大。 strcat本身不分配空间。您必须手动管理该内存。

至于更好的方法,你可能想使用string来看看。您不需要担心内存,并且可以与+运算符连接。

3

您只为路径分配一个字节(char path[1])。您需要分配足够的空间来保存您创建的整个路径。给定C++标记,很明显可能是使用std::string,并且在将所有片段放在一起形成一个完整路径后,使用其成员函数c_str()以C风格字符串的形式访问内容。

1

更改char path[1];到:

char path[512]; //or whatever value you like. 

在你的代码,仅路径1个性格和\0分配的空间。显然你需要一个更大的目录,据我所知,在unix中,目录名最多可以有255个字符,所以我认为512就足够了。

1

小心使用strcpy。即使path仅为char[1],它也不会执行边界检查,它将尝试将所有directory复制到其中。这可能是你的seg故障。

对于如何构建字符串,您有很多选择。这是一个漫长的SO张贴在C++字符串连接效率:

Efficient string concatenation in C++

如果您使用C++,有没有你不能只用任何理由内置string库与+操作?例如:

string path; 
//... 
path += directory; 
path += "/"; 
path += entry->d_name; 
//etc. 

使用string类可能会稍微低效率的,但它会帮助你避免缓冲区溢出问题,就像你得到的分割故障存储器例外额外的好处(我不是说string将避免所有这些,但它会让你的生活更轻松)。

有也一直在另一个之前的SO张贴关于如何建立一个目录字符串在C++:

c++ how to create a directory from a path

相关问题