我正在进行BattleShip游戏,我需要一些帮助整理船只。开始了。
我有一个船级:
class Ship {
public:
Ship(char symbol, PositionChar position, char orientation, unsigned int size, unsigned int color);
private:
unsigned int number;
char symbol;
PositionInt position;
char orientation;
unsigned int size;
unsigned int color;
string status;
};
我有一个Board类,其中包含:
vector <Ship> ships;
我需要从.txt加载信息:
tabuleiro: 10 x 10
1 - Porta-avioes - 5 - P - Vermelho_claro
1 - Fragata - 4 – F - Magenta_claro
2 - Cruzador - 3 - C - Verde_claro
3 - Submarino - 2 - S - Castanho
4 - Lancha - 1 - L - Azul_claro
我用这个获取信息:
while (getline(config, tmp)) {
config >> nr >> tmp >> nome >> tmp >> size >> tmp >> simb >> tmp >> cor; //de maneira analoga ao tabuleiro faz ignora os espaços e recolhe a info dos navios
if (config.eof())
break;
nr - 船只数量 nome - 船名 尺寸 - 大小 simb - 代表它的char cor - color
现在,我的问题是。我需要存储所有这些船(每条线都是一艘船)和矢量信息。向量中的每个元素都将包含我从txt加载的所有信息。
我该怎么做?
提前谢谢
祝你好运
答案 0 :(得分:2)
我首先要为operator>>
课程重载ship
:
std::istream &operator>>(std::istream &is, Ship &s) {
std::string tmp;
return is >> s.nr >> tmp
>> s.nome >> tmp
>> s.size >> tmp
>> s.simb >> tmp
>> s.cor;
}
这允许您将文件中的数据直接读取到Ship
对象中,例如:
std::ifstream in("yourfile.txt");
Ship some_ship;
in >> some_ship;
它(与其他流提取器一样)返回对您正在读取的istream
对象的引用。这允许两件事。第一个是链接运算符,因此您可以一次读取两个(或更多)项目:
in >> ship_a >> ship_b;
这也意味着您可以检查流提取是否成功:
if (in >> some_ship)
// ...
...或者在循环中读取(例如)当你到达文件末尾时退出:
while (in >> some_ship)
process(some_ship);
该标准还包括istream_iterator
类型,它将使用operator>>
通过迭代器接口读取内容。您可以使用它来(例如)读取一个装满Ship对象的整个文件,并使用它们来初始化一个向量:
std::ifstream input("YourFilename.txt");
std::vector<Ship> ships { std::istream_iterator<Ship>(input),
std::istream_iterator<Ship>() };
这确实有一个缺点:它隐含地假设一旦你读完一条记录的结尾,你就会有一些空格(空格,制表符,换行符等)然后立即将成为下一个Ship
对象的记录。如果您的输入文件可能在行的末尾包含一些额外的垃圾(在ship对象本身的所有字段之后),您可以读取一行数据,然后使用stringstream
来解析一个对象离开那条线:
std::string s;
Ship temp;
while (std::getline(input, s)) {
std::istringstream is(s);
if (!is >> temp)
break;
ships.push_back(temp);
}
这允许您在一行结尾处丢弃任何多余的数据。您一次读取一行文件,然后从该行解析您关心的数据。当你完成后,你只需忽略剩下的任何内容,然后继续下一行。
答案 1 :(得分:1)
直接解决您的疑虑
ships.push_back(Ship(nr,nome,size,...))
这应该在每艘船的循环中完成。