【发布时间】:2015-07-21 05:10:35
【问题描述】:
我正在尝试逐行读取文件。 将每一行转换为以空字符结尾的字符串。 将所有行推入向量并返回。
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。
我到底要如何在 const char* 上使用 new 关键字并在它意识到它是 const 之前同时向它添加内容?
(更不用说我必须一个接一个地删除它们,另一方面......真是一团糟)
编辑: 我宁愿返回一个向量,但这一切都是因为我不知道将向量转换为 const char** 的快速(单行)方法:
void glShaderSource(GLuint shader,
GLsizei count,
const GLchar **string,
const GLint *length);
【问题讨论】:
-
有什么原因不能返回
std::vector<std::string>? -
为什么向量元素必须是
const char *?考虑将它们设为strings,或者如果您真的需要char *,则以 C 方式分配它们。 -
因为 glshaderSource 需要一个 const char* 数组,如果我陷入困境并将整个着色器放在一行中,那么我不会收到有用的编译器错误消息(如果所有错误都出现在第 1 行,如果整个着色器在一行中)
-
你不需要每行有一个字符串来获得正确的消息,你只需要在每行的末尾有 \n 个字符(即读取整个文件,而不是每行与getline)。 glShaderSource 中的多个字符串是为了在代码来自不同文件时使用。
-
@Jerem。我不知道这个。我将它作为一个字符串尝试,每行带有 \n 并且它也可以工作(并且它为编译错误提供了行号)。感谢您的提示!