c++ - 读取文件并根据该信息制作对象 vector

标签 c++ file stream playing-cards

我有 2 个扑克牌值的枚举,它们的点数和花色。我想获取一个包含如下数据的文件:

2C 6D 7h 10s JC

此信息决定一张扑克牌。

6c 是梅花6。

JC 是俱乐部的 jack ,等等。 (大小写无关紧要)。

如何使用输入的字符制作新的扑克牌?为每个可能的字符串设置一个 case 似乎需要很多行代码。可以以某种方式简化吗?

#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;
     }
    }

最佳答案

首先,我建议将您的输入代码重写为如下所示:

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

参见 this question为什么不检查 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);
}

关于c++ - 读取文件并根据该信息制作对象 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28138089/

相关文章:

c - 向客户端 C 显示文件夹服务器的内容

java - 无法让 ObjectInputStream 工作

c++ - 仅手动冲洗 cout

c++ - 带有 glsl 着色器的 Vulkan 教程

C++:查找可分为两组的数组项的所有组合

c++ - 相交线与二次贝塞尔三角形

objective-c - 在 Objective-C 中比较两个 xml 文件

c++ - std::vector 是否需要使用移动而不是复制?

c - 从C中的多个文件中读取字符

java - 关闭特定输出流的方法