C: file e fscanf

di il
13 risposte

C: file e fscanf

Buongiorno, sto cercando di scrivere un programma che legga un file contenente i dati relativi alle prenotazioni di un cinema (nome dell' spettatore, posto, orario) e dia la possibilità di ricercare un certo spettatore, oppure inserirne di nuovi. Ho riscontato dei problemi con la lettura del file, ma non capisco perché.

Il file contiene 4 righe con il seguente formato:
nome cognome, posto, ora:minuti\n

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

struct cinema {
  char nome[20];
  int posto;
  int ora;
  int minuti;
 };
  
int main(int argc, char **argv) {
 
 FILE *fp;
 fp = fopen(argv[1], "a+");
 if(fp == NULL) {
 printf("errore nell'apertura\n");
 exit(1);
 }
 
struct cinema *cine;
cine = malloc(sizeof(struct cinema)*4);      //4 sono le righe del codice
int i;

for(i=0; i<4; i++) {
fscanf(fp, "%s, %d, %d:%d\n", &cine[i].nome, &cine[i].posto, &cine[i].ora, &cine[i].minuti);
printf("%s, %d, %d:%d\n", cine[i].nome, cine[i].posto, cine[i].ora, cine[i].minuti);       //non stampa correttamente il contenuto del file
}

.....

13 Risposte

  • Re: C: file e fscanf

    E ti fermi qui? Che difficoltà? Dacci maggiori dettagli del problema.
  • Re: C: file e fscanf

    Il primo %s leggerà solo il nome, in quanto si fermerà al primo whitespace. Nel tuo caso lo spazio fra nome e cognome.
  • Re: C: file e fscanf

    Mi sono fermato lì perché ho notato che proprio non legge il file (anche se ciò non implica che io ritenga il resto del programma perfetto). Per quanto riguarda %s, ho già provato ad inserire nella struct anche un char cognome[20];

    Comunque..
    Prima dell'int main ho definito la funzione:
    
    struct cinema CERCA(char *nome, struct cinema *c) {
     struct cinema retval;
     int i = 0;
     while (i<4 && (strcmp (nome, c[i].nome) != 0)) {
        i++;
      }
      if(i<4)
        retval = c[i];
      else
        retval.nome[0] = '\0';
      return retval;
      }
      
    E il resto dell'int main:
    
    char scelta;
    printf ("inserisci opzione: a) ricerca, b) aggiungi\n");
    scanf("%c", &scelta);
    
    if(scelta == 'a') {
     char nome[20];
     printf("inserisci nome: ");
     scanf("%[^\n]", &nome);
     getchar();
     struct cinema ricerca;
     ricerca = CERCA(nome, cine);
     printf("dati: %s, %d, %d:%d\n", ricerca.nome, ricerca.posto, ricerca.ora, ricerca.minuti);
     }
     
     if(scelta == 'b') {
      int quanti;
      printf("quanti ne vuoi inserire?");
      scanf("%d", &quanti);
      
      for(i=4; i<4+quanti; i++) {
      printf("nome: ");
      scanf("%[^\n]", &cine[i].nome);
      getchar();
      printf("posto:");
      scanf("%d", &cine[i].posto);
      printf("ora: ");
      scanf("%d", &cine[i].ora);
      printf("minuti: ");
      scanf("%d", &cine[i].minuti);
      
      fprintf(fp, "%s %s, %d, %d:%d\n", cine[i].nome, cine[i].posto, cine[i].ora, cine[i].minuti);
      }
     }
     
     free(cine);
     close(fp);
    return 0;
    }
      
    
  • Re: C: file e fscanf

    Continuo a non capire il problema ... se poi cambi il codice ad ogni post, le cose si complicano.

    Posta una sola volta tutto il codice dall'inizio alla fine e spiega esattamente cosa succede (errori di compilazione, funzionamento non voluto ...)
  • Re: C: file e fscanf

    Non capisci il mio problema o l'esercizio?
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct cinema {
      char nome[20];
      int posto;
      int ora;
      int minuti;
     };
    
    struct cinema CERCA(char *nome, struct cinema *c) {
     struct cinema retval;
     int i = 0;
     while (i<4 && (strcmp (nome, c[i].nome) != 0)) {
        i++;
      }
      if(i<4)
        retval = c[i];
      else
        retval.nome[0] = '\0';
      return retval;
      }
      
    int main(int argc, char **argv) {
     
     FILE *fp;
     fp = fopen(argv[1], "a+");
     if(fp == NULL) {
     printf("errore nell'apertura\n");
     exit(1);
     }
     
    struct cinema *cine;
    cine = malloc(sizeof(struct cinema)*4);      //4 sono le righe del codice
    int i;
    
    for(i=0; i<4; i++) {
    fscanf(fp, "%s, %d, %d:%d\n", &cine[i].nome, &cine[i].posto, &cine[i].ora, &cine[i].minuti);
    printf("%s, %d, %d:%d\n", cine[i].nome, cine[i].posto, cine[i].ora, cine[i].minuti);       //non stampa correttamente il contenuto del file
    }
    char scelta;
    printf ("inserisci opzione: a) ricerca, b) aggiungi\n");
    scanf("%c", &scelta);
    
    if(scelta == 'a') {
     char nome[20];
     printf("inserisci nome: ");
     scanf("%[^\n]", &nome);
     getchar();
     struct cinema ricerca;
     ricerca = CERCA(nome, cine);
     printf("dati: %s, %d, %d:%d\n", ricerca.nome, ricerca.posto, ricerca.ora, ricerca.minuti);
     }
     
     if(scelta == 'b') {
      int quanti;
      printf("quanti ne vuoi inserire?");
      scanf("%d", &quanti);
      
      for(i=4; i<4+quanti; i++) {
      printf("nome: ");
      scanf("%[^\n]", &cine[i].nome);
      getchar();
      printf("posto:");
      scanf("%d", &cine[i].posto);
      printf("ora: ");
      scanf("%d", &cine[i].ora);
      printf("minuti: ");
      scanf("%d", &cine[i].minuti);
      
      fprintf(fp, "%s, %d, %d:%d\n", cine[i].nome, cine[i].posto, cine[i].ora, cine[i].minuti);
      }
     }
     
     free(cine);
     close(fp);
    return 0;
    }
    
  • Re: C: file e fscanf

    Il tuo problema. Non l'hai ancora spiegato bene.
  • Re: C: file e fscanf

    Allora, in parole povere, quando vado a stampare i dati letti dal file (c'è un commento accanto all'operazione), non li stampa. Pertanto ho pensato ci sia un problema (non so quale, perché utilizzo lo stesso metodo per ogni esercizio e negli altri casi funziona sempre) nella fscanf. Ho provato anche ad inserire due stringhe separate per nome e cognome, ma non risolvo niente. Idem togliendo la punteggiatura.
  • Re: C: file e fscanf

    Questo perché, come ti è stato detto, la fscanf incontra lo spazio tra nome e cognome. Se vuoi mantenere questo formato dati devi scrivere

    "%[^,], %d, %d:%d\n"

    nella fscanf
  • Re: C: file e fscanf

    Giusto, ho corretto. Ma non cambia niente...
  • Re: C: file e fscanf

    Ho corretto anch'io ... non [^\n] ma [^,]
  • Re: C: file e fscanf

    Ecco, ora fscanf funziona! Grazie mille
    Però, andando avanti, non tornano né la ricerca né inserimento di un nuovo spettatore.. Per quanto riguarda la prima, dato
    
    char nome[20];
    printf("inserisci nome: ");
    scanf("%[^\n]", &nome);
    printf("nome da cercare: %s\n", nome);  
    
    non stampa la stringa nome..

    Mentre per l'inserimento
    
     printf("posto:");
      scanf("%d", &cine[i].posto);
      printf("ora: ");
      scanf("%d", &cine[i].ora);
      printf("minuti: ");
      scanf("%d", &cine[i].minuti);
    
    non riesco ad inserire posto, ora e minuti.
  • Re: C: file e fscanf

    Il codice (che avevi mostrato prima) aveva una getchar, ma nel posto sbagliato. Deve essere
    
     getchar();
     scanf("%[^\n]", nome);
    
  • Re: C: file e fscanf

    Il problema era lo stesso anche per la seconda parte. Ora funziona tutto! Grazie mille!
Devi accedere o registrarti per scrivere nel forum
13 risposte