将3D数组写入文本文件,然后将文本文件读入数组

时间:2014-09-03 23:20:16

标签: c++ arrays io

将卡座打印到屏幕后,我想将此3D阵列保存到文本文件中。最终能够将这个文本文件读回各种各样的组合。但是,当我完成所有操作时,我得到的文本文件是" usdeck"用十六进制表示。我尝试使用下面的代码,但它不起作用...帮助?

ofstream myfile;
myfile.open ("unshuffled deck.txt");
myfile << usdeck;
myfile.close;


// deck of cards
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
const char usdeck[4][13][14] = 
{
{"heart two", "heart three", "heart four",
"heart five", "heart six", "heart seven",
"heart eight","heart nine", "heart ten",
"heart jack","heart queen", "heart king",
"heart ace"},
{"diamond two", "diamond three", "diamond four",
"diamond five", "diamond six", "diamond seven",
"diamond eight", "diamond nine", "diamond ten",
"diamond jack", "diamond queen", "diamond king",
"diamond ace"},
{"club two", "club three", "club four", "club five",
"club six", "club seven", "club eight", "club nine",
"club ten", "club jack", "club queen", "club king",
"club ace"},
{"spade two", "spade three", "spade four",
"spade five", "spade six", "spade seven",
"spade eight", "spade nine", "spade ten",
"spade jack", "spade queen", "spade king",
"spade ace"}
};

for(int row=0;row<4; row++)
{
for(int column=0;column<13;column++)
    {
    for(int element=0;element<14;element++)
        {
    cout << usdeck[row][column][element] << " ";
        }
    cout <<endl;
}
}


return 0;

}

1 个答案:

答案 0 :(得分:0)

我建议你改变你的数据结构。随着你的进步,你开始看到困难。

要将数据写入文件并将其读回,您需要构建数据以便于阅读。我建议每行一个条目。这将允许使用std::istream::getline函数来读回它。

原谅我的风格,但我喜欢在操作员之间放置空格以便于阅读。 :-)

输出到文件:

for (unsigned int r = 0; r < 4; ++r)
{
  for (unsigned int c = 0; c < 13; ++c)
  {
    data_file << usdeck[r][c] << '\n';
  }
}

从文件输入:

for (unsigned int r = 0; r < 4; ++r)
{
  unsigned int c = 0;
  for (c = 0; c < 13; ++c)
  {
    // Read in the data and test for success.
    if (!data_file.getline(&usdeck[r][c][0], '\n', 14))
    {
      break;
    }
  }
  if (c < 13)
  {
    break;
  }
}

更好的数据结构

在我看来,您的数据结构很难使用。大多数计算机不是为有效处理文本字符串而设计的它们旨在更有效地处理数字。所以,让我们使用数据的数据结构。

由于套件中的卡片数量不是负数且套牌中的套装数量不是负数,我们将使用unsigned整数。这将允许编译器更好地检查我们的代码是否存在错误。

让我们来看看甲板。它由52张牌组成:每件西装13张牌和4件西装。我们可以将卡片表示为具有价值和诉讼的对象:

enum Suit_Type {Heart, Diamond, Spade, Club};
struct Card
{
  Suit_Type     suit;
  unsigned int  value;
};

通过这种表示,每个Card都有一个套装和一个值。

因此,Deck必须是卡片的容器:

const unsigned int CARDS_PER_DECK = 52;  // 13 cards per suit * 4 suits.
unsigned int Deck[CARDS_PER_DECK];  // A container of cards.  

在大多数纸牌游戏中,卡片不会停留在牌组中,而是从牌组移动到牌手。阵列可以是卡片进入的情况,但我们需要更灵活的东西。我们可以从中移除卡片的数据结构,容器将缩小以适应。我们试试std::vector

  std::vector<Card> deck1(CARDS_PER_DECK);

std::vector对每位玩家也很有用:

  std::vector<Card> player1;
  std::vector<Card> player2;

甲板的初始化留作OP的练习。

在大多数纸牌游戏中,牌从中央牌组传到玩家:

  player1.push_back(deck1.back());
  deck.pop_back();
  player2.push_back(deck1.back());
  deck.pop_back();

由于这是C ++,因此可以将方法添加到Card结构中,以便对Card个实例进行排序,读取和写入。

可以创建独立的功能来分析玩家的手牌(这是牌的矢量)。

撰写Card
将卡写入输出流的简单方法:

    struct Card
    {
      Suit_Type     suit;
      unsigned int  value;
      void write(std::ostream& out)
      {
        static const char value_name[] =
        {
          "zero", "Ace", "two", "three", "four",
          "five", "six", "seven", "eight", "nine",
          "ten", "jack", "queen", "king"
        }
        switch(suit)
        {
           case Heart: out << "heart "; break;
           case Diamond: out << "diamond "; break;
           case Spade: out << "spade "; break;
           case Club: out << "club "; break;
        }
        out << value_name[value] << "\n"; // one card per line.
      }
    };

将卡输出到控制台:

Card c;
c.suite = Club;
c.value = 1;
c.write(cout);

将卡片输出到文件:

  ofstream card_file("cards.txt");
  c.write(card_file);

输出玩家的手:

  std::vector<Card>::const_iterator iter;
  for (iter =  player1.begin();
       iter != player1.end();
       ++iter)
  {
    iter->write(cout);
  }

这些只是更改数据结构的一些好处。