我有以下课程
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
字段必须在类中填充*
。
课程Person
由Name
和Surname
组成,并且有一个调用的重载operator >>
:
void load(ifstream& in) {
getline(in,name);
getline(in,surname);
}
解析此文件结构的最佳方法是什么?我不能使用正则表达式或比ifstream更高级的东西。我关注的是检测文件结尾和人员列表结束的方式(以及代码中的位置)。
非常感谢你的帮助! (如果你能用英语纠正任何错误,我会很高兴的!:))
答案 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_authors
和n_actors
变量是多余的,因为您已经拥有自终止列表。如果您愿意,您可以或应该使用变量作为完整性检查。