如何将以下文本文件解析成类?

时间:2011-12-09 10:19:34

标签: c++

我有以下课程

class Film {
    Person authors[5]; //This will actually include only the director
    string title;
    string producer;
    int n_authors;
    int year;
    int running_time;
    Person actors[5];
    int n_actors;
}

以下文件格式(不要问我为什么使用这个,我必须使用这种格式)

Stanley
Kubrick  
#          
2001: A Space Odissey
*
1968
161
Keir
Dullea
Gary 
Lockwood
#

#表示列表的结尾(在本例中为'Person'类),而*表示缺少字段(在本例中为生产者,顺便提一下producer字段必须在类中填充*。 课程PersonNameSurname组成,并且有一个调用的重载operator >>

void load(ifstream& in) {
    getline(in,name);
    getline(in,surname);
}

解析此文件结构的最佳方法是什么?我不能使用正则表达式或比ifstream更高级的东西。我关注的是检测文件结尾和人员列表结束的方式(以及代码中的位置)。

非常感谢你的帮助! (如果你能用英语纠正任何错误,我会很高兴的!:))

1 个答案:

答案 0 :(得分:5)

标准读物成语:

#include <fstream>   // for std::ifstream
#include <sstream>   // for std::istringstream
#include <string>    // for std::string and std::getline

int main()
{
    std::ifstream infile("thefile.txt");
    std::string line;

    while (std::getline(infile, line))
    {
        // process line
    }
}

如果它说“过程线”,你应该添加一些跟踪解析器当前状态的逻辑。

对于您的简单应用程序,您可以按照格式指定的位,读取列表和标记进行操作。例如:

std::vector<std::string> read_list(std::istream & in)
{
    std::string line;
    std::vector<std::string> result;

    while (std::getline(in, line))
    {
        if (line == "#") { return result; }
        result.push_back(std::move(line));
    }

    throw std::runtime_error("Unterminated list");
}

现在你可以说:

std::string title, producer, token3, token4, token5, token6;

std::vector<std::string> authors = read_list(infile);

if (!(std::getline(infile, title)    &&
      std::getline(infile, producer) &&
      std::getline(infile, token3)   &&
      std::getline(infile, token4)   &&
      std::getline(infile, token5)     ) )
{
    throw std::runtime_error("Invalid file format");
}

std::vector<std::string> actors = read_list(infile);

您可以使用std::stoi将令牌3 - 5转换为整数:

int year = std::stoi(token4);
int runtime = std::stoi(token5);

请注意,n_authorsn_actors变量是多余的,因为您已经拥有自终止列表。如果您愿意,您可以或应该使用变量作为完整性检查。