[C] ADT coda utilizzando file

Messaggioda Cicchi27 » 13/08/2020, 16:26

Salve, ho cominciato a trattare l'argomento che riguarda gli ADT di prima categoria. Insieme al materiale delle lezioni erano allegati delle cartelle contenenti i codici di alcuni programmi dimostrativi, e uno di questi, include l'implementazione della coda utilizzando file. Questi sono i codici i vari codici:

"L'implementazione"
Codice:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "queue.h"
#include "item.h"

struct queue { int head; int tail; int N; int maxN; FILE *s;};

Q queueInit(int maxN) {
  Q coda = malloc(sizeof(Q));
  char nomefile[15];
  sprintf(nomefile, "queue_%p\n", coda); 
  if ((coda->s = fopen(nomefile, "wb+")) == NULL) {
       puts("File could not be opened.");
       return(NULL);
  }
  coda->head = coda->tail = 0;
  coda->maxN = maxN;
  return coda;
}

int queueIsEmpty(Q coda) {
  return coda->N == 0;
}

void queueEnqueue(Q coda, Item item) {
  if ( coda->N < coda->maxN ) {
    fseek(coda->s, (coda->tail) * sizeof(Item), SEEK_SET);
    fwrite(&item, sizeof(Item), 1, coda->s);
    coda->tail = (coda->tail + 1)%coda->maxN;
    coda->N++;
  }
  else puts("Not enqueued. Queue overflow.\n");
}

Item queueDequeue(Q coda) {
  if ( coda->N > 0 ) {
    fseek(coda->s, (coda->head) * sizeof(Item), SEEK_SET);
    Item value;
    fread(&value, sizeof(Item), 1, coda->s);
    coda->head = (coda->head + 1)%coda->maxN;
    coda->N--;
    return value;
  }
  else puts("Not dequeued. Queue underflow.\n");
  return NULLITEM;
}



"Gli header files"
Codice:
typedef int Item;

#define NULLITEM -1
#define eq(a, b) ((a) == (b))

Codice:
#include "item.h"

typedef struct queue *Q;

Q queueInit(int maxN);
int queueIsEmpty(Q);
void queueEnqueue(Q, Item);
Item queueDequeue(Q);


"Un client"
Codice:
#include <stdio.h>
#include <string.h>
#include "item.h"
#include "queue.h"

void instructions(void);

int main(void) { 
  Q coda = queueInit(100);
  int value;
 
  instructions();
  printf("%s", "? ");
  char choice;
  scanf("%c", &choice);

  while (choice != '3') {
      switch (choice) {
         case '1':     
            printf("%s", "Enter an integer: ");
            scanf("%d", &value);
            queueEnqueue(coda, value);
            break;
         case '2':     
            if (!queueIsEmpty(coda)) {
               printf("The dequeued value is %d.\n", queueDequeue(coda));
            }
            break;
        case '\n':
          break;
         default:
            puts("Invalid choice.\n");
            instructions();
            break;
      }
      printf("%s", "? ");
      scanf("%c", &choice);
   }
   puts("End of run.");
}

// display program instructions to user
void instructions(void)
{
   puts("Enter choice:\n"
      "1 to put a value in the queue\n"
      "2 to get a value off the queue\n"
      "3 to end program");
}


Da quello che ho capito questo programma dovrebbe creare dei file binari contenenti gli elementi inseriti dal client. Ma a quanto pare non sembra funzionare correttamente, e non essendoci nessun riferimento a questa implementazione nelle lezioni, non riesco a capire il problema e non ho neanche la possibilità di avere qualche delucidazione. E' possibile avere qualche chiarimento? Grazie mille in anticipo!
Cicchi27
New Member
New Member
 
Messaggio: 37 di 84
Iscritto il: 01/03/2020, 10:11

Re: [C] ADT coda utilizzando file

Messaggioda apatriarca » 19/08/2020, 20:21

La coda è implementata come se fosse memorizzata in un array di dimensione fissata, ma scrivendo i valori su file piuttosto che in memoria. Per accedere ad un elemento usa infatti fseek per trovare la posizione dell'elemento per poi scrivere o leggere un blocco della stessa dimensione dell'elemento. È più che altro un codice di esempio in quanto nessuno farebbe mai qualcosa del genere.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5466 di 10438
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] ADT coda utilizzando file

Messaggioda Cicchi27 » 21/08/2020, 12:54

Certo, sicuramente il codice è stato scritto a scopo didattico, ma volevo solo capire cosa avrebbe dovuto fare e il perché. Ora comunque è più chiaro.
Cicchi27
New Member
New Member
 
Messaggio: 38 di 84
Iscritto il: 01/03/2020, 10:11


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron