结构不兼容的C ++向量?

时间:2012-12-28 19:35:04

标签: c++ vector struct scanf

我正在使用一些文件并尝试加载它们。我想用一个向量来存储最终信息,所以我可以保持全局,而不需要知道它有多大。这是我的代码,但程序没有完成启动:

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;

3 个答案:

答案 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;)在这种情况下很有用,当你有从字符串加载的值时。

我希望我的回答可以帮助你。