我正在写小游戏。 我想从.txt文件中读取对象位置。 我想写一个代码来读取这样的文件(来自.txt):
rock01
400.0 100.0 100.0
500.0 200.0 200.0
600.0 300.0 200.0
palm01
500.0 200.0 200.0
float 1是将要创建的对象的x,第二个是y,第三个z。 名称(例如' rock01')是要创建的对象的名称。
我的想法是读取对象名称,然后当下一行包含坐标而不是对象名称时,使用此坐标创建新对象。
所以上面的代码应该创建3个岩石和一个手掌。
我的代码
std::fstream file;//.txt file
file.open(filename, std::ios::in);
std::string word;//name of the object
while(file >> word)
{
if(word == "rock01")
{
//and here I don't know how to read coordinates until next line is string
//so I read first...thing, and if it is float it creates new rock
float x;
while(file >> x)
{
rocks = new D_CRock;
rocks->position.x = x;
file >> rocks->position.y >> rocks->position.z
}
}
else if(word == "palm01") {
... }
}
这段代码令人担忧,但只针对第一个对象(如果我输入这样的代码,它只创建3个岩石:
rock01
400.0 100.0 100.0 4.0 170.0
500.0 200.0 200.0 4.0 0.0
rock01
600.0 300.0 200.0 4.0 90.0
rock01
400.0 100.0 400.0 1.0 170.0
它只会产生2块岩石而忽略其余部分。
如何在不移动迭代器的情况下阅读下一个序列(从空格到空格,如'文件>> someWord或someFloat' - 不是字符)? 如何读取此序列的类型(检查它是浮点还是仅字符串)?
我想知道如何以有效的方式做到这一点。
由于
答案 0 :(得分:3)
查看输入文件,您可能希望执行以下操作:
有许多不同的方法可以做到这一点,下面大致说明逻辑。
// Example program
#include <iostream>
#include <string>
#include <fstream>
bool contains_letter(std::string const& str)
{
// There are many other ways to do this, but for the sake of keeping this answer short...
return name.find_first_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ") != std::string::npos;
}
int main(int argc, char* argv[])
{
std::ifstream file;
file.open("filename.txt");
// ...
while (!file.eof())
{
std::string line;
std::getline(file, line);
if (contains_letter(line))
{
// ... Start a new object
}
else
{
// ... Parse the coordinates and add an instance
}
}
// ...
}