+ Rispondi al messaggio
Pagina 2 di 3 primaprima 123 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 22

Prenotazione camere

  1. #11
    pir
    pir non è in linea Novello
    Post
    12
    Like Inviati  
    0
    Like Ricevuti  
    0
    Facciamo una cosa, cerco di essere più chiaro:
    il mio problema principale è come aggiornare un file dopo averlo letto.
    Leggo la riga->faccio delle operazioni -> assegno la camera-> modifico il file per evitare che il file me la assegni di nuovo(cambiando il numerino o anche banalmente cancellandola se si può, è uguale).
    l'ultima operazione non ho idea di come farla.
    In linea generale, leggo una riga-> faccio qualcosa->modifico il file (lo stesso file, non uno nuovo)
    si può fare?
    se sì, mi spiegate come ?

  2. #12
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,504
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    35
    No. Ti ripeto.

    Leggi TUTTE le righe in memoria, esegui in memoria tutte le ricerche e modifichi i valori in modo opportuno, scrivi nel file tutti i dati aggiornati che hai in memoria.

    Quindi non riga per riga. Capito?

    Cominciamo dall'inizio ... Scrivi il codice che legge TUTTO il file e lo mette in memoria nelle strutture.
    ℹ️ Leggi di più su AntonioG ...

  3. #13
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Post
    6,236
    Like Inviati  
    21
    Like Ricevuti  
    11
    Quote Originariamente inviato da pir Visualizza il messaggio
    In linea generale, leggo una riga-> faccio qualcosa->modifico il file (lo stesso file, non uno nuovo)
    si può fare?
    NO, non si può fare.
    Così è chiaro per te?
    ℹ️ Leggi di più su gibra ...

  4. #14
    pir
    pir non è in linea Novello
    Post
    12
    Like Inviati  
    0
    Like Ricevuti  
    0
    beh, non capisco perchè rispondere a questa maniera, sopratutto perchè, invece, si può fare( anzi, si può fare ben più) ed eccone la prova:

    /*  http://areeweb.polito.it/didattica/fondinf/Piccolo_InformaticaDM270/Testi_Esame/20170915/  TURNO D  */
    #include <stdio.h>
    #include <stdlib.h>
    #define d 100
    
    typedef struct assegnazioni{
       int ncamera;
       int nosp;
     
     
    }s_assegnazioni;
    
    int main()
    {
       FILE* fp;
       int f_camtot, f_n, f_nosp, f_stato, osp[d],i,pos, flag, cont=0;
       s_assegnazioni assegn[100]; 
       int n; 
      
       printf("parametri: ");
       scanf("%d%*c", &n);
       
       for(i=0;i<n;i++){
        scanf("%d%*c", &osp[i]); 
       }
     
       fp=fopen("camere.txt", "r+");
    
       if(fp==NULL){
        printf("errore: file non aperto correttamente");
       }
    
     fscanf(fp, "%d", &f_camtot); //lettura prima riga(numero camere) 
     fseek(fp, 1, SEEK_CUR); //skip riga 1 (sposto il cursore saltando un carattere ossia la prima riga in questo caso specifico) 
     
     if(f_camtot<n){
     	printf("camere totali insufficienti rispetto a quelle desiderate");
        exit(0); 
     }
     
     for(i=0;i<n;i++){
     	flag=1; 
       while(fscanf(fp,"%d %d %d",&f_n, &f_nosp, &f_stato)!=EOF && flag==1){
       
    	if(osp[i]==f_nosp && f_stato==0){
    	        assegn[i].ncamera= f_n;
    			assegn[i].nosp=f_nosp; 
                
    			fseek(fp, -1, SEEK_CUR);  //spostamento il cursore
                fputc('1' ,fp);          //aggiornamento file
                fseek(fp, 1, SEEK_SET); //cursore all'inizio del file (Saltando riga 1)
                
    			cont++; //conto quante ne assegno 
                flag=0; //avendola trovata esco e passo alla prossima stanza 
                
    } //chiuso if
       } //chiuso while
    } //chiuso for
    
      if(cont==n) {
      
      	printf("assegnazione riuscita: \n");
        for(i=0;i<n;i++)
        	printf("camera: %d persone: %d \n", assegn[i].ncamera, assegn[i].nosp); 
    } else{
    	printf("assegnazione non riuscita: numero di camera insufficienti");
    }
    
    
        return 0;
    }
    
    c'è solo una cosa che non so esattamente a cosa imputare e che non va(consultare prima la prova d'esame nel primo commento del codice e il relativo esempio): la prima riga ''effettiva''del file, ossia cominciando a contare dalla seconda(perchè la prima contiene solo il numero complessivo di camere) non viene mai considerata salvo che il mio input non sia di questo tipo(considerando l'esempio di quella prova d'esame) "n 2 <ospiti>, <ospiti1>..." ossia chiedendo n camere e 2 persone proprio nella prima o in maniera generale, se chieda delle camere e il primo numero di ''persone da sistemare'' sia proprio il numero di spot di quella camera. in quel caso tutto liscio. Nel qual caso in cui io invece inserisca anche lo stesso input ma invertendo le cifre dopo la prima (esempio l'input dell'esempio della prova 3 1 2 1 ) la prima riga non viene più calcolata e questo vale solo per quella. Per tutte le altre dopo test ripetuti non capita nulla che non vada. Sapreste dirmi a cosa imputarlo?
    avevo pensato ad un errore nel riposizionare il cursore nell'ultima fseek() ma questo avrebbe provocato uno sfasamento generale (immagino).
    Grazie in anticipo

  5. #15
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,504
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    35
    Non ti ho detto che non puoi modificare il file (e comunque puoi farlo solo perché modifichi lo stesso numero di caratteri, per capirci non potresti modificare da 0 a 10).

    Il fatto è che così il tuo programma è altamente inefficiente in quanto legge il file n volte.
    In più non sai quanto sia n, può essere 5, 10, 100 e anche il carattere di fine linea LF o i caratteri CR LF se sei su windows, quindi quella fseek non ti funzionerà così.
    Potresti includere nel ciclo l'apertura, la lettura della prima riga e la chiusura, ma aumenterebbe l'inefficienza.

    Io ti suggerivo di leggerlo una sola volta, lavorare in memoria e scriverlo una sola volta, ma fai come vuoi.
    ℹ️ Leggi di più su AntonioG ...

  6. #16
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Post
    6,236
    Like Inviati  
    21
    Like Ricevuti  
    11

  7. #17
    pir
    pir non è in linea Novello
    Post
    12
    Like Inviati  
    0
    Like Ricevuti  
    0
    Non volevo sembrare scortese o presuntuoso, solo che mi avete detto entrambi che non si potesse fare, anche con una certa decisione, e invece non era così. In ogni caso, se l'efficienza del programma non è un granchè ritento e il codice che segue immagino sia ciò che mi suggeriva AntonioG(circa). Può anche essere snellito volendo eliminando tutte le variabili di lettura da file che ho poi assegnato alla struttura e leggendo direttamente usando la stessa, ma prima di tutto volevo un fix sulla parte finale della scaletta cioè "riscrivere il file". Il programma infatti funziona come deve però non mi riscrive come deve la tabella, ossia me la riscrive senza andare a capo (tutta su una stessa linea).
    L'idea era stampare prima il primo numerino ( cioè la prima riga) e poi mandarlo a capo portandolo ogni volta alla fine del file con SEEK_END nella fseek per poi stampare la riga dopo alla ciclata successiva ecc ma non funziona per come mi aspetto:/
    Quindi il problema è la parte compresa tra il commento "riscrittura del file " e "output". Il resto funziona



    #include <stdio.h>
    #include <stdlib.h>
    #define d 100
    
    typedef struct camere{
       int ncamera;
       int nosp;
       int stato;
       int cambiato;
    }s_camere;
    
    int main(int argc, char* argv[])
    {
       FILE* fp;
       int f_camtot, f_n, f_nosp, f_stato, osp[d], i, j, cont=0, esci=0;
       s_camere camere[d];
       int n, N=0; //n numero celle osp[], N numero elementi della struttura
    
       printf("parametri: ");
       scanf("%d%*c", &n);
    
       for(i=0;i<n;i++){
        scanf("%d%*c", &osp[i]);
       }
    
       fp=fopen("cam.txt", "r+");
    
       if(fp==NULL){
        printf("errore: file non aperto correttamente");
        return -1;
       }
    
     fscanf(fp, "%d", &f_camtot); //lettura prima riga(numero camere)
     fseek(fp, 1, SEEK_CUR); //skip riga 1
    
    
    //acquisizione dati in memoria
       while(fscanf(fp,"%d %d %d",&f_n, &f_nosp, &f_stato)!=EOF ){
    	        camere[N].ncamera= f_n;
    			camere[N].nosp=f_nosp;
                camere[N].stato=f_stato;
                camere[N].cambiato=0; //flag di riconoscimento per l'output
                N++;
    
       } //chiuso while
    
       fclose(fp);
    
    //operazioni
    for(i=0;i<n;i++){
    	esci=0;
    	j=0;
    	while(j<N && esci==0){
    
    	if(osp[i]==camere[j].nosp && camere[j].stato==0){
                camere[j].stato=1;      //aggiorno lo stato (in memoria)
                camere[j].cambiato=1;
    			cont++;               //conto quante ne assegno
    			esci=1;             //passo al prossimo input
    
    } else
       j++;
    
    }//chiuso while
    }//chiuso for
    
      if(cont==n) { //se ho sistemato tutti gli ospiti (1)
     
    //riscrittura del file
        fp=fopen("cam.txt", "w"); //riaperture file in modalità scrittura
    
         fprintf(fp,"%d", f_camtot);
          fseek(fp, 1, SEEK_CUR);
    
    	for(i=0;i<N;i++){
        fprintf(fp, "%d %d %d", camere[i].ncamera, camere[i].nosp, camere[i].stato); //aggiorno (sovrascivendo) il file
        fseek(fp, 1, SEEK_END); 
    }     
         
          fclose(fp);
    
      	//output
       printf("assegnazione riuscita: \n");
       for(i=0;i<N;i++){
      if(camere[i].cambiato==1)  //stampo solo quelle modificate
        	printf("camera: %d persone: %d \n", camere[i].ncamera, camere[i].nosp);
             } //chiuso for
       printf("la tabella è stata aggiornata");
    
    
    } else{  //riferito all'if(1)
    	printf("assegnazione non riuscita: numero di camere disponibili insufficiente\n tabella non aggiornata");
    }
    
        return 0;
    }
    

  8. #18
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,504
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    35
    Per cortesia, mi indichi un mio post in cui c'è scritto che non puoi modificare il file?
    O piuttosto è dall'inizio che ti dico che non devi modificare il file ma riscriverlo tutto una sola volta?

    Cosa che hai fatto solo adesso, peraltro, finalmente.

    Per andare a capo basta scriverlo nella fprintf con "%d\n"
    ℹ️ Leggi di più su AntonioG ...

  9. #19
    pir
    pir non è in linea Novello
    Post
    12
    Like Inviati  
    0
    Like Ricevuti  
    0
    grazie mille, adesso va come deve (e ho rimosso anche le fseek che c'erano mettendo degli \n, credevo che non funzionassero per i file)

  10. #20
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,504
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    35
    Ma non mi hai risposto alla prima domanda. La polemica non è mai positiva.
    ℹ️ Leggi di più su AntonioG ...

+ Rispondi al messaggio
Pagina 2 di 3 primaprima 123 ultimoultimo

Potrebbero interessarti anche ...

  1. Sttruttura per Prenotazione RIcambi
    Da MAURO.MAURO nel forum Microsoft Word
    Risposte: 1
    Ultimo Post: 11-08-2016, 11:19
  2. Form per prenotazione
    Da kmsta nel forum Microsoft Access
    Risposte: 1
    Ultimo Post: 17-10-2015, 19:33
  3. Inserimento Prenotazione con Agenda
    Da Giovas91 nel forum MySQL
    Risposte: 4
    Ultimo Post: 26-05-2013, 13:01
  4. Distribuzione delle camere nella colonna del mese.
    Da blackjerry nel forum Microsoft Word
    Risposte: 16
    Ultimo Post: 04-06-2010, 19:54