填充char**

dar*_*een 1 c++

我正在尝试从另一个文件中读取文件列表.文件读取有效但填充char*数组不是.它适用于第一次迭代,但随后在下一行得到一个错误的指针.我尝试使用字符串向量但遇到问题,我认为由于它的析构函数试图释放argv.

char **datafiles = (char**)malloc(0);
int filecount = 0;

master.AddDataFiles(argv[1],datafiles,filecount);

int Manager::AddDataFiles(char *filename, char **filelist, int &filecount)
{
    const int LINEMAX = 64;
    struct stat info;
    std::ifstream is(filename);
    if (is.fail()) return 1;

    char buffer[LINEMAX];

    while(!is.eof())
    {
        is.getline(buffer,LINEMAX);
        realloc(filelist,sizeof(char**) * (filecount + 1));
        filelist[filecount] = (char*) malloc(std::strlen(buffer) + 1);
        std::strcpy(filelist[filecount],buffer);
        filecount++;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 5

使用realloc正确的是一个有点棘手-它可以(有时,但不总是会)返回一个指针不同的比你传递给它的一个,所以你必须做这样的事情:

char **temp = realloc(filelist, sizeof(char**) * filecount+1);
if (temp != NULL)
    filelist = temp;
else
    failed_allocation();
Run Code Online (Sandbox Code Playgroud)

另请注意,您while (!file.eof())的错误是经典错误 - 它无法正确判断文件的结尾.

我会重新审视字符串选项的向量.也许您可以发布您拥有的代码,并询问您遇到的任何问题.让它运作良好几乎肯定会比修复它更少工作,结果几乎肯定会更加坚实和易懂.

正确的代码看起来像这样:

std::vector<std::string> Manager::AddDataFiles(std::string const &filename) { 
   std::ifstream infile(filename.cstr());
   std::vector<std::string> filenames;
   std::string temp;
   while (std::getline(infile, temp))
       filenames.push_back(temp);
   return filenames;
}
Run Code Online (Sandbox Code Playgroud)