Lettura file di un database

di Anonimizzato19537 il
50 risposte

50 Risposte - Pagina 3

  • [Code ]#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char parole[50]; int i=0; char nome[50], sala[50], orario[50], posti[50], prezzo[50]; FILE *fp; fp=fopen("programmazione.db", "r"); if(fp==NULL) { printf("Impossibile aprire il file\n"); exit(0); } sscanf(parole, "%s %s %s %s %s", nome, sala, orario, posti, prezzo); if(argc==2) { while(!feof(fp)) { fgets(parole, 50, fp); if(!strcmp(orario, argv[1])) printf("%s\n", parole); } } if(argc==3) { while(!feof(fp)) { fgets(parole, 50, fp); if( atof(prezzo) < atof (argv[2]) ) printf("%s\n", parole); } } else { printf("Inserire almeno un parametro\n"); } fclose(fp); return 0; } [\code]
  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
       char parole[50];
       int i=0;
       char nome[50], sala[50], orario[50], posti[50], prezzo[50];
       
       
       FILE *fp;
    
       fp=fopen("programmazione.db", "r");
    
       if(fp==NULL)
       {
          printf("Impossibile aprire il file\n");
          exit(0);
       }
    
       sscanf(parole, "%s %s %s %s %s", nome, sala, orario, posti, prezzo);
    
       if(argc==2)
       {
       
          while(!feof(fp))
          {
            fgets(parole, 50, fp);
            
    
            if(!strcmp(orario, argv[1]))
              printf("%s\n", parole);
          }
       }
       if(argc==3)
       {
          while(!feof(fp))
          {
    	fgets(parole, 50, fp);
    
    	if( atof(prezzo) <  atof (argv[2]) )
    	  printf("%s\n", parole);
          }
       }
       else
       {
          printf("Inserire almeno un parametro\n");
       }
    
       fclose(fp);
    
     return 0;
    }
    
  • La sscanf va fatta NEI ciclo DOPO la fgets!

    Prima leggi la linea dal file e dopo prendi le parti. Il contrario che senso ha?
  • Hai pienamente ragione oregon ora funziona. ultima cosa nel caso argc contiene 3 elementi deve stamparmi tutti i record che contengono un prezzo inferiore a quello inserito e che ci siano posti disponibili in sala quindi devo usare l'operatore logico and ho scritto cosi però mi da errore quando vado a compilare perchè?
    
    if(argc==3)
       {
          while(!feof(fp))
          {
    	fgets(parole, 50, fp);
            sscanf(parole, "%s %s %s %s %s", nome, sala, orario, posti, prezzo);
    	if( atof(prezzo) <  atof (argv[2]) && (int)posti>0)
    	  printf("%s\n", parole);
          }
    
  • Di nuovo?

    posti è una stringa e va trasformata in numero !

    E non dimenticare che il testo chiedeva un'altra cosa
  • Con 2 parametri, prende in input da linea di comando il titolo di un film ed un prezzo massimo che l’utente è disposto a pagare per vedere il film. Il programma, esaminando il database programmazione.db,/stampa le informazioni (titolo, sala, orario, posti disponibili e prezzo) relative a tutte le proiezioni del film per le quali il prezzo del biglietto è minore del prezzo massimo specificato sempre a condizione che ci siano ancora posti disponibili.

    giustamente è una stringa quindi devo usare atoi però scrivendo atoi(posti)>0 comunque non funziona
  • Non funziona ... Cioè? Che succede?
  • Niente avevo sbagliato nella prima fgets non so perchè ma avevo scritto fgets(fp, 50 fp) ho risolto grazie mille oregon te ne sono immensamente grato...
    ultima domanda e la smetto giuro per fare questo esercizio devo creare una struttura altrimenti non posso verificare le temperature massime e minime di ogni riga giusto?

    Scrivere un programma temperature che dato un database che
    memorizza le temperature minime e massime registrate in alcune città italiane ed in vari
    giorni permetta di interrogare il database fornendo le seguenti informazioni:
    1. se lanciato senza parametri, fornisce la temperatura minima e la temperatura massima
    in assoluto (tutte le città tutti i giorni), unitamente al giorno ed alla città in cui sono state
    registrate.
    2. se lanciato con una data fornisce la temperatura minima e massima relativamente al
    giorno specificato (quindi su tutte le città), unitamente alla città in cui sono state
    registrate.
    3. se lanciato con un nome di città, fornisce la temperatura minima e quella massima
    relativamente a quella città (quindi su tutte le date), unitamente al giorno in cui sono state
    registrate.
    Si assuma che il database delle temperature sia memorizzato in un file il cui nome è
    temperature.db)e che il file contenga le informazioni di ogni singola città e giorno nel
    formato data, città, temperature minima e temperatura massima, con spazi che separano i
    campi. Le date sono specificate nel formato dd/mm/aaaa. I nomi di città non contengono
    spazi.
  • Per altri problemi devi creare un nuovo thread.

    Ma tornando a noi, ancora non hai completato il programma attuale !

    Manca il confronto con il titolo del film !
  • Scusami non lo sapevo.
    perchè è sbagliato il confronto? atof non trasforma una stringa in un float? io non ho considerato il titolo del film perchè se inserisco ./a.out rambo 7.50 il programma mi stampa tutti i film con un prezzo minore di quello inserito in input e con posti in sala ancora disponibili
  • Il testo dell'esercizio dice di trovare un film dal titolo specifico. Se non lo cerchi, non stai risolvendo l'esercizio, quindi voto negativo.

    EDIT: il confronto è corretto, lascia perdere, quello che manca è il confronto del titolo. Il titolo che inserisci da tastiere deve essere scritto con maiuscole e minuscole uguali a quelle memorizzate, se usi la strcmp
  • 
    While(!feof(fp))
          {
    	fgets(parole, 50, fp);
            sscanf(parole, "%s %s %s %s %s", nome, sala, orario, posti, prezzo);
    	if(!strcmp(argv[1], nome)){
    	  if( atof(prezzo) < atof(argv[2]) && atoi(posti)>0)
    	     printf("%s\n", parole);
              }
    	}
    
    ora ho scritto cosi per il controllo del nome, però non capisco l'errore del < la traccia mi chiede che il prezzo deve essere inferiore al quello inserito in input

    e se compilo cosi: ./a.out Rambo 6.00 mi stampa cosi
    Rambo 3 18:30 50 5.50

    Rambo 3 22:30 23 5.50

    Rambo 3 22:30 23 5.50

  • No ... rileggi le correzioni, il confronto del prezzo è corretto, va bene così.

    L'ultima linea è duplicata perché nel file di testo hai dato un invio dopo l'ultima linea creando una linea vuota.
    Apri l'editor ed elimina questo ritorno a capo.

    Puoi usare la funzione strcmpi per fare il confronto ignorando le maiuscole/minuscole.
    Puoi scrivrre il confronto in una sola if

    if(strcmpi(argv[1], nome)==0 && atof(prezzo)<atof(argv[2]) && atoi(posti)>0)
  • Non c'è nessuna linea vuota nel file di testo. Grazie per la strcmpi
  • C'è un "ritorno a capo" nell'ultima linea. Toglilo
Devi accedere o registrarti per scrivere nel forum
50 risposte