将config.txt数据保存在双向链接列表中

时间:2018-12-20 18:11:55

标签: c

我目前正在尝试使用c创建基于控制台的单人纸牌游戏。我想要一个txt文件来“模拟卡片组”,这意味着配置文件应具有从黑色A,2、3、4 ....到红色J,Q,K ...的所有卡。

我成功读取并标记了我的配置文件,但对于如何将“卡”保存在双向链接列表中一无所知。

这里是我到目前为止编写的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct card
{
  char color;
  int value;
  char name[2];
  struct card * prev;
  struct card * next;
} CARD_TYPE;


int main(int argc, char *argv[])
{
  for (int i = 0; i < argc; i++)
  {
    printf("argv[%d] = %s\n", i, argv[i]);
  }

  int counter_red = 0;
  int counter_black = 0;

  char buffer[255];


  FILE* path = fopen (argv[1],"r");

  if (path == NULL)
  {
    printf("[ERR] Invalid file!\n");
    return 3;
  }

  while(fgets(buffer, 255, path) != NULL )
  {
    if (strlen(buffer) == 1) //string is empty
    {
      continue;
    }
    CARD_TYPE* temp = malloc(sizeof(CARD_TYPE));//DONT FORGET TO FREE
    temp->color = '\0';
    temp->name[0] = '\0';

    char *read = strtok(buffer," ");
    while (read != NULL)
    {
      if (strcmp (read, "BLACK" ) == 0 )
      {
        counter_black ++;
      }
      else if (strcmp (read, "RED" ) == 0 )
      {
        counter_red ++;
      }
        printf("%s", read);
        read = strtok(0, " ");

    }

  }

  if (counter_black != 13)
  {
    printf("[ERR] Invalid file!\n");
  }

所以现在我要以正确的顺序(与文件中相同的顺序)保存卡。

是否可以一次完成所有这些操作?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您有一个CARD_TYPE* temp,需要(命名更好并)填充。您正在穿过缓冲区,然后检查缓冲区中的卡是否为黑色。因此,您需要设置卡的值。

while (read != NULL)
{
  if (strcmp (read, "BLACK" ) == 0 )
  {
    temp->color = // what goes here?
    counter_black ++;

然后您需要找出它的卡等级。您需要文件中的更多信息。你是怎样做的? (如果信息不合理怎么办?这件事怎么会失败?)。现在,上一个和下一个指针只是NULL。

然后,您需要将此临时卡添加到双向链接列表中。您可能应该在某个地方声明一个列表。叫它

CARD_TYPE* deck;

卡座一旦设置好,就可以简单地设置为第一张卡。但这是一个清单。因此,您从文件中读取的第二张卡将设置为...。卡去哪儿了? (您将要创建一个单独的功能,以将卡添加到列表中。这会分配一些空间并更新列表并使它保持有效状态。)

您的老师提醒您在使用完所有内存后将其释放。退出程序之前,最好遍历列表并一一释放它。这样,您可以选择此代码并在其他地方使用它,而该代码不会位于main.c的顶部。