我将文件读成字符串。该文件如下所示:
x y z
57.016998 6.841027 -14.977446
53.777576 5.513538 -19.883400
51.014915 3.275565 -26.822357
48.367588 4.105481 -18.890682
我想把这个字符串放到矢量< 3>,xyz。这可能吗?我很感激你的帮助。
答案 0 :(得分:3)
这实际上非常简单:
struct Vector3
{
float x, y, z;
};
int main()
{
std::string input = "57.016998 6.841027 -14.977446\n";
std::stringstream ss(input);
std::vector<Vector3> Vertices; // list of vertices
Vector3 v;
ss >> v.x;
ss >> v.y;
ss >> v.z;
Vertices.push_back(v);
return 0;
};
这应该足以创建一个完全可行的解决方案。但是请注意:std :: stringstream是一个简单但不是最快的解决方案。
作为奖励,如果你正在加载大量的顶点,我真的建议你查看字符串标记器,尽管它们对初学者来说可能有点太多了。 使用令牌,您的结束代码如下所示:
TokenStr buffer("57.016998 6.841027 -14.977446\n"); // custom tokenizer class
while (buffer)
{
Vector3 v;
v.x = buffer.nextFloat(); // grab next float, skipping whitespace
v.y = buffer.nextFloat();
v.z = buffer.nextFloat();
Vertices.push_back(v);
}
一些注意事项:
修改强> 感谢Ben Voigt的提醒,您只需使用C标准库即可轻松实现此目的,而无需使用任何自定义标记器包装类:
const char* str = "57.016998 6.841027 -14.977446\n27.016998 1.841027 -44.977446";
while (*str)
{
Vector3 v;
v.x = strtof(str, (char**)&str);
v.y = strtof(str, (char**)&str);
v.z = strtof(str, (char**)&str);
Vertices.push_back(v);
}
答案 1 :(得分:0)
要将文件中的所有字符串读入vector:
fstream f;
f.open( "file.txt", std::ios::in);
if (!f) return -1;
vector<string> strings;
std::copy( istream_iterator<string > (f), // copy file content
istream_iterator<string > (), std::back_inserter( strings)); // to vector
f.close();
读取三个向量:
std::vector<string> x;
std::vector<string> y;
std::vector<string> z;
fstream f;
f.open( "file.txt", std::ios::in);
if (!f) return -1;
std::string line;
while( std::getline( f, line)) {
std::istringstream is(line);
x.push_back( *is++);
y.push_back( *is++);
z.push_back( *is);
}
f.close();