如何在C ++中阅读自定义格式文本文件

时间:2015-04-06 11:55:26

标签: c++ file loops

我正在写小游戏。 我想从.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' - 不是字符)? 如何读取此序列的类型(检查它是浮点还是仅字符串)?

我想知道如何以有效的方式做到这一点。

由于

1 个答案:

答案 0 :(得分:3)

查看输入文件,您可能希望执行以下操作:

  • 每行
    • 检查非数字字符
    • 如果找到,请启动新对象
    • else,解析坐标并创建新实例

有许多不同的方法可以做到这一点,下面大致说明逻辑。

// 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
        }
    }

    // ...
}