我正在尝试从另一个文件中读取文件列表.文件读取有效但填充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)
使用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)