Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将目录中具有完整路径的所有文件传递到execv中的参数数组?_C++_Stdvector_Execvp - Fatal编程技术网

C++ 如何将目录中具有完整路径的所有文件传递到execv中的参数数组?

C++ 如何将目录中具有完整路径的所有文件传递到execv中的参数数组?,c++,stdvector,execvp,C++,Stdvector,Execvp,我正在尝试读取给定目录中的所有文件(图片)并将其传递给execv。我想启动帧缓冲区图像查看器(fbi) 现在,当我从图片所在的目录启动它时,它就可以工作了。如何操作向量,使其不仅保存文件名,还保存路径+文件名 int startSlideshow (char* pathtoFBI) { pid_t fbiPid; fbiPid = fork(); if (fbiPid == 0) { /* this is the child process */ DIR *pictureDi

我正在尝试读取给定目录中的所有文件(图片)并将其传递给execv。我想启动帧缓冲区图像查看器(fbi)

现在,当我从图片所在的目录启动它时,它就可以工作了。如何操作向量,使其不仅保存文件名,还保存路径+文件名

int startSlideshow (char* pathtoFBI) {
pid_t fbiPid;

fbiPid = fork();

if (fbiPid == 0) {
    /* this is the child process */
    DIR *pictureDirectory;
    struct dirent *dir;
    int i = 0;
    vector<char*> argVector;
    char pDirectory[] = "/home/pi/bilder/";
    argVector.push_back(pathtoFBI);         /* first Argument is Program name */
    pictureDirectory = opendir(pDirectory);
    if (pictureDirectory){
        while ((dir = readdir(pictureDirectory)) != NULL) {
            i++;
            if (i > 2) {            /* first element is "." second is ".." */
                argVector.push_back(dir->d_name);
            }
        }
        //i -= 2;

    } else ERREXIT("reading picture directory");

    closedir(pictureDirectory);

    argVector.push_back(NULL);
    char** fbiArgv = &argVector[0];
    execvp(pathtoFBI, fbiArgv);         /* pid is taken over by fbi */
    _exit(EXIT_FAILURE);
}
int startSlideshow(char*pathtoFBI){
pid_t fbiPid;
fbiPid=fork();
如果(fbiPid==0){
/*这是子进程*/
目录*图片目录;
结构方向*dir;
int i=0;
向量argVector;
char pDirectory[]=“/home/pi/bilder/”;
argVector.push_back(pathtoFBI);/*第一个参数是程序名*/
pictureDirectory=opendir(PDdirectory);
if(图片目录){
while((dir=readdir(pictureDirectory))!=NULL){
i++;
如果(i>2){/*第一个元素是“.”,第二个元素是“.”*/
argVector.push_back(dir->d_name);
}
}
//i-=2;
}else ERREXIT(“读取图片目录”);
closedir(图片目录);
argVector.push_back(空);
字符**fbiArgv=&argVector[0];
执行副总裁(pathtoFBI,fbiArgv);/*pid由fbi接管*/
_退出(退出失败);
}

给定您的代码,您只需在每个文件名前添加PDdirectory:

--- c1.cc       2013-02-04 02:35:47.000000000 +0400
+++ c2.cc       2013-02-04 02:39:03.000000000 +0400
@@ -8,7 +8,7 @@
     DIR *pictureDirectory;
     struct dirent *dir;
     int i = 0;
-    vector<char*> argVector;
+    vector<char*> argVector; vector<string> fpVector;
     char pDirectory[] = "/home/pi/bilder/";
     argVector.push_back(pathtoFBI);         /* first Argument is Program name */
     pictureDirectory = opendir(pDirectory);
@@ -16,7 +16,8 @@
         while ((dir = readdir(pictureDirectory)) != NULL) {
             i++;
             if (i > 2) {            /* first element is "." second is ".." */
-                argVector.push_back(dir->d_name);
+                fpVector.push_back(string(pDirectory) + dir->d_name);
+                argVector.push_back((char*) fpVector.back().c_str());
             }
         }
         //i -= 2;
--c1.cc 2013-02-04 02:35:47.000000000+0400
+++c2.cc 2013-02-0402:39:03.000000000+0400
@@ -8,7 +8,7 @@
目录*图片目录;
结构方向*dir;
int i=0;
-向量argVector;
+向量argVector;向量fpVector;
char pDirectory[]=“/home/pi/bilder/”;
argVector.push_back(pathtoFBI);/*第一个参数是程序名*/
pictureDirectory=opendir(PDdirectory);
@@ -16,7 +16,8 @@
while((dir=readdir(pictureDirectory))!=NULL){
i++;
如果(i>2){/*第一个元素是“.”,第二个元素是“.”*/
-argVector.push_back(dir->d_name);
+fpVector.push_back(字符串(pddirectory)+dir->d_名称);
+argVector.push_back((char*)fpVector.back().c_str());
}
}
//i-=2;

更一般地说,还有Boost文件系统和。

谢谢!这很好用。但是我用“string fpString”替换了“vector fpVector”,并在while循环中使用“fpString=string(pddirectory)+dir->d_name;'以避免有2个向量。您不应该这样做,因为execvp需要由字符串分配的cstring,如果您的字符串是临时的,那么cstring将挂起。