Чтение файла и создание вектора объектов на основе этой информации

У меня есть 2 перечисления значений для игральных карт, их ранг и масть. Я хочу взять файл, состоящий из таких данных:

2C 6D 7h 10s JC

Эта информация определяет игральную карту.

6c — это 6 клубов.

Джей Си — это клубный джек, и так далее. (Дело не имеет значения).

Как взять введенные символы и использовать их для создания новой игральной карты? И наличие регистра для каждой возможной строки кажется большим количеством строк кода. Можно ли это как-то упростить?

#include "header1card.h"#include "stdafx.h"#include <string>
#include <vector>
#include <iostream>
#include <fstream>

using namespace std;

int main() {
Card card;
}

class Card {
private:
enum struct ranks {two, three, four, five, six, seven, eight,
nine, ten, jack, queen, king, ace };
enum struct suits {diamonds, clubs, hearts, spades };
suits su; //do what with these two?
ranks ra;
};int fileparser(vector<Card> & readcards, char * filename) {
ifstream filereading;
filereading.open(filename, ios::in);

if (filereading.is_open()) {
//while read the file here. save what is read to a string.
char temp;

while (!filereading.eof()) {
//how make a card based off of the inputtedr chars?
char readchar = filereading.get(temp );

switch (readchar) {
case '2' :

break;
case '3' :

break;

//and so on to make every card? Seems like a lot of lines of code.
}
readcards.pop_back( /*After making the card, put it in vector*/   );

}
filereading.close();
}
else {
//throw error, cannot find file.
cout << "Could not find file " + filename << endl; //error on ' + filename'. Says Expression must have integral or unscoped enum type.
cerr << "COuld not find file " << endl;
}
}

0

Решение

Во-первых, я рекомендую переписать ваш входной код так:

Card temp;
while (filereading >> temp) {
readcards.push_back(temp); // note: push_back, not pop_back
}

Увидеть этот вопрос почему бы не проверить eof(),

Итак, с этим нам просто нужно написать operator>> для нашего класса:

class Card {
public:
friend istream& operator>>(istream& is, Card& c) {
std::string name;
if (is >> name) {
if (name.size() == 2) {
// rank is name[0], suit is name[1]
// go process
}
else {
// set fail state
is.setstate(std::ios::failbit);
}
}
return is;
}
};

Итак, как мы можем получить звание и костюм? Это была основная часть вашего вопроса. Для костюмов самая простая вещь — это просто переключатель:

switch (toupper(name[1])) {
case 'D':
c.suit = Card::diamonds;
break;
case 'S':
// etc.
default:
// set fail state, maybe log some error too
is.setstate(std::ios::failbit);
}

Для рангов мы можем упростить 2, 3, ..., 9 расставаться с:

if (name[0] >= '2' && name[0] <= '9') {
int idx = name[0] - '2'; // now it's an int, with value 0 through 7
c.rank = Card::two + idx; // because enums are ordered
}
else {
// fallback to switch
switch (toupper(name[0])) {
case 'T':
c.rank = Card::ten;
break;
case 'J':
// etc
default:
// set fail state
is.setstate(std::ios::failbit);
}
2

Другие решения


По вопросам рекламы [email protected]