сохранить данные config.txt в двусвязном списке - PullRequest
0 голосов
/ 20 декабря 2018

В настоящее время я пытаюсь создать консольную пасьянс в c.Я хочу, чтобы txt-файл «имитировал колоду», что означает, что в конфигурационном файле должны быть все карты от ЧЕРНОГО A, 2,3,4 .... до RED 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 голосов
/ 20 декабря 2018

У вас есть CARD_TYPE* temp, который вам нужно (назовите лучше и) заполнить.Вы проходите через буфер и проверяете, черная ли карта в буфере.Таким образом, вы должны установить значения для вашей карты. Так:

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

И затем вам нужно выяснить, какой это рейтинг карты.Вам нужно больше информации из файла.Как ты это делаешь?(А что, если информация не имеет смысла? Как эта вещь терпит неудачу?).Пока указатели prev и next равны NULL.

Затем вам нужно добавить эту временную карту в двусвязный список.У вас, вероятно, должен быть где-то объявлен список.Давайте назовем это

CARD_TYPE* deck;

Колоду можно просто установить на первую карту, как только вы ее сделаете.Но это список.Таким образом, вторая карта, которую вы читаете из файла, будет установлена ​​на ... что?Куда идет карта?(Вы захотите создать отдельную функцию для добавления карточек в список. Что-то, что занимает некоторое место, обновляет список и оставляет его в действительном состоянии.)

И ваш учитель напомнил вам освободитьвся ваша память, когда вы закончите с этим.Рекомендуется пройтись по списку и освободить его все по одному перед выходом из программы.Таким образом, вы можете взять этот код и использовать его в другом месте, где он не будет жить на вершине main.c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...