繁体   English   中英

如何返回以null结尾的const char *向量?

[英]How to return a vector of null terminated const char*?

我正在尝试逐行读取文件。 将每一行转换为以null结尾的字符串。 将所有行推入向量并将其返回。

vector<const char*> TypeGLscene::LoadGLshader (string ThisFile)
{
ifstream fromFile;
fromFile.open(ThisFile);
if (fromFile.good()==false)
{
    cout<<"Could not find file: "<<ThisFile<<endl;
    exit(1);
}

vector<const char*>  FileContents;
const char*    OneLine;
string         LineStr;

while (fromFile.good()==true)
{
    getline(fromFile,LineStr);
    OneLine = LineStr.c_str();
    FileContents.push_back(OneLine);
}

fromFile.close();
return FileContents;

问题在于所有的char字符串都是在堆栈中创建的,该函数将char *的向量返回到无处。

我正在尝试通过以下方式在堆上分配内存:

OneLine = new char[LineStr.size()+1];

但是我被卡住了,因为一旦分配,我就不能复制任何东西。 内容是常量。

我到底要如何在const char *上使用new关键字,并在意识到它是const的同时向其添加内容?

(更不用说我随后必须一个接一个地删除它们……真是一团糟)

编辑:我宁愿返回一个向量,但所有这一切是因为我不知道一种将向量转换为const char **的快速方法(一行):

void glShaderSource(GLuint shader,
                    GLsizei count,
                    const GLchar **string,
                    const GLint *length);

返回std::vector<char*>充满了问题。

  1. 您必须为每行分配内存。 函数的客户端必须添加代码以释放内存。 客户端代码变得比需要的更为复杂。

  2. 客户端函数必须知道char*是使用malloc还是operator new分配的。 它们必须遵循用于分配内存的方法来遵循适当的方法来进行内存重新分配。 再次,客户负担太多了,要了解该功能的作用及其作用方式。

更好的方法是仅返回std::vector<std::string>

std::vector<std::string>  FileContents;
std::string LineStr;

while (fromFile.good()==true)
{
    getline(fromFile,LineStr);
    FileContents.push_back(LineStr);
}

fromFile.close();
return FileContents;

如果必须返回std::vector<char*> ,则可以使用:

std::vector<char*>  FileContents;
std::string LineStr;

while (fromFile.good()==true)
{
    getline(fromFile,LineStr);
    char* line = new char[LineStr.size()+1];
    strcpy(line, LineStr.c_str());
    FileContents.push_back(line);
}

fromFile.close();
return FileContents;

您可以转换然后从C ++ 11中调用glShaderSource

std::vector<std::string> vec;

使用

{
  std::vector<const Glchar*> veccstr 
     = std::transform(vec.begin(), vec.end(), 
                      [](const std::string&s){
                         return static_cast<const Flchar*>(s.c_str()); });
  glShaderSource(shader, veccstr.size(), veccstr.data(), &length);
}

了解有关C ++ 11 std :: vector :: datastd :: transform的信息

我假设一个typedef char Flchar; (OpenGL?)库中的某个位置,或者至少

static_assert("Flchar same size as char", sizeof(Flchar) == sizeof(char));

顺便说一句,我们都知道sizeof(char)始终为1,因此您可以将sizeof(Flchar)==1改为在static_assert sizeof(Flchar)==1

结合Sahu和Jerem的建议,我完全改变了策略,并简单地(从文件读取功能返回)单个字符串,每个着色器行包含换行符:

string TypeGLscene::LoadGLshader (string ThisFile)
{
   ifstream fromFile;
   fromFile.open(ThisFile);
   if (fromFile.good()==false)
   {
       cout<<"Could not find file: "<<ThisFile<<endl;
       exit(1);
   }

   string  FileContents, oneLine;

   while (fromFile.good()==true)
   {
       getline(fromFile,oneLine);
       FileContents += (oneLine + "\n");
   }
   fromFile.close();
   //FileContents=FileContents.c_str();
   return FileContents;
}

然后将那一个字符串输入glshaderSource

char* ShaderChapters[1]; ShaderChapters[0]=&fileContent[0];
GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(VertexShaderID,1,ShaderChapters,0);
glCompileShader(VertexShaderID);

尽管如此,考虑到原始问题的措辞,萨胡的答案仍然是最准确的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM