我正在使用一些文件并尝试加载它们。我想用一个向量来存储最终信息,所以我可以保持全局,而不需要知道它有多大。这是我的代码,但程序没有完成启动:
std::string one = "v 100.32 12321.232 3232.6542";
struct Face {float x, y, z;};
std::vector<struct Face> obj;
char space[3];
sscanf(one.c_str(), "%s %f %f %f", space, &obj[1].x1, &obj[1].y1, &obj[1].z1);
std::cout << obj[1].x1 << std::endl;
答案 0 :(得分:3)
默认构造的vector
开始为空,即使编译器允许您使用operator []
,也是这样做的未定义行为。
您可以在创建vector
时分配一些空格:
std::vector<struct Face> obj(2); // Allow enough space to access obj[1]
答案 1 :(得分:2)
如果要在向量中写入元素1,则向量必须为size() >= 2
。在您的示例中,size()
始终为0.
考虑创建一个临时Face
,然后push_back
将其添加到vector<Face>
。
答案 2 :(得分:1)
也许您使用sscanf是有充分理由的,但至少我认为可以指出您可以使用流将信息加载到结构中。
在这种情况下,我建议您使用istringstream类,它允许您从字符串中读取值作为值,并根据需要进行转换。所以,你的代码,我想我可以改成它:
std::string one = "v 100.32 12321.232 3232.6542";
struct Face {float x,y,z;};
std::vector<struct Face>obj;
char space[3];
// As mentioned previously, create a temporal Face variable to load the info
struct Face tmp; // The "struct" maybe can be omited, I prefer to place it.
// Create istringstream, giving it the "one" variable as buffer for read.
istringstream iss ( one );
// Replace this line...
//sscanf(one.c_str(), "%s %f %f %f",space,&obj[1].x1,&obj[1].y1,&obj[1].z1);
// With this:
iss >> space >> tmp.x >> tmp.y >> tmp.z;
// Add the temporal Face into the vector
obj.push_back ( tmp );
// As mentioned above, the first element in a vector is zero, not one
std::cout << obj[0].x1 << std::endl;
istringstream类(需要包含&#34; sstream&#34;)在这种情况下很有用,当你有从字符串加载的值时。
我希望我的回答可以帮助你。