Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problema apertura/scrittura file [C]

    Salve! Mi servirebbe una mano da voi esperti di C (ne capisco pochissimo ancora :berto: )
    Ho questo:
    Un programma di archiviazione dei file musicali gestisce playlist separate di brani, ciascuna delle quali contiene le seguenti informazioni: titolo del brano,autore,album,durata. Si supponga l'esistenza di due playlist: "Anni 80" e "Anni 90", entrambe di 100 elementi ordinate alfabeticamente per titolo e archiviate rispettivamente sul file "ottanta.dat" e "novanta.dat". Si progetti tramite un flow-chart strutturato un programma che:
    a. Legga dai file entrambe le playlist;
    b. Con una procedura crei una playlist unica a partire dalle due precedenti, chiamata "Anni 80-90" ed anch'essa ordinata alfabeticamente per titolo.
    c. Registri la nuova playlist su un file "ottnov.dat", prima inesistente in memoria...

    questo è il problema...

    ora io ho fatto cosi(credo di aver sbagliato un pò di cose):

    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stddef.h>
    #include <string.h>

    typedef struct {
            
    char Titolo[20];
            
    char Autore[20];
            
    char Album[20];
            
    int Durata;
            } 
    Anni_80Anni_90;
            
    Anni_80 Anni80[100];
    Anni_90 Anni90[100];
    int main(int argcchar *argv[])
    {
      
    FILE *ot,*no;
      
    FILE *otno;
      
    /*apertura dei due file*/
      
    ot=fopen("ottanta.dat","r+");
      
    no=fopen("novanta.dat","r+");
      
    /*se non si posso aprire*/
      
    if(ot==NULL || no==NULL)
      {
                 
    puts("Uno dei due file non puo essere aperto");
      }
      
    rewind(ot);
      
    rewind(no);
    fread(&Anni80,sizeof(Anni_80),1,ot);
    fread(&Anni90,sizeof(Anni_90),1,no);

    otno=fopen("ottnov.dat","w+");
    void CreaPlaylist(ot,no); /*prototipo della procedura*/
    fwrite(&otno,sizeof(otno),1,otno);
    fclose(otno);
    system("PAUSE");    
    return 
    0;
    }
    /*creamo la procedura per creare una playlist unica a partire dalle precedenti*/
    void CreaPlaylist(Playlist1,Playlist2)
    {
        
    char p1,p2;
        
    char scat;
        if(
    strcmp(p1,p2)<=0)
        {
                           
    strcpy(scat,p1);
                           
    strcat(scat,p2); 
     }
         else
         {
             
    strcpy(scat,p2);
             
    strcat(scat,p1);
         }
     } 
    Qualcuno è cosi gentile da potermi aiutare??

    Grazie mille!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Comincia da ...

    1) se si verifica un errore di apertura del file, oltre ad avvisare l'utente, devi anche eseguire delle istruzioni atte a terminare il programma, altrimenti questo continuera' ad essere eseguito ...

    2) subito dopo che i file sono stati aperti, la rewind e' inutile ...

    3) la corretta apertura del file in scrittura non e' stata controllata ...

    4) i file in lettura non sono stati chiusi ...

    5) il prototipo di una funzione va inserita in testa al programma e non dentro al main; in quest'ultimo va inserita la chiamata alla funzione ... Nel prototipo inoltre, manca il tipo degli argomenti ...

    6) non si capisce quali siano gli argomenti passati alla CreaPlaylist ... (cosa e' Playlist1, Playlist2 ???) ... fra l'altro non li usi all'interno della funzione stessa in cui confronti dei dati locali mai inizializzati ... insomma la CreaPlayList e' tutta da "pensare" ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Comincia da ...

    1) se si verifica un errore di apertura del file, oltre ad avvisare l'utente, devi anche eseguire delle istruzioni atte a terminare il programma, altrimenti questo continuera' ad essere eseguito ...

    2) subito dopo che i file sono stati aperti, la rewind e' inutile ...

    3) la corretta apertura del file in scrittura non e' stata controllata ...

    4) i file in lettura non sono stati chiusi ...

    5) il prototipo di una funzione va inserita in testa al programma e non dentro al main; in quest'ultimo va inserita la chiamata alla funzione ... Nel prototipo inoltre, manca il tipo degli argomenti ...

    6) non si capisce quali siano gli argomenti passati alla CreaPlaylist ... (cosa e' Playlist1, Playlist2 ???) ... fra l'altro non li usi all'interno della funzione stessa in cui confronti dei dati locali mai inizializzati ... insomma la CreaPlayList e' tutta da "pensare" ...
    Allora..innanzitutto grazie per la risposta!

    Poi..
    1) risolto con la funzione exit(1); (non so se era questo che intendevi);
    2)Eliminata la rewind;
    3)Chiusi i file in lettura;
    5)Prototipo aggiunto prima del main con l'aggiunta dei tipi. Chiamata della funzione aggiunto nel main;
    6)questo è il punto del non ritorno..

    Ecco il prog nuovo:
    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stddef.h>
    #include <string.h>

    typedef struct {
            
    char Titolo[20];
            
    char Autore[20];
            
    char Album[20];
            
    int Durata;
            } 
    Anni_80Anni_90;
            
    Anni_80 Anni80[100];
    Anni_90 Anni90[100];
    void CreaPlaylist(FILE ot,FILE no); /*prototipo della procedura*/
    int main(int argcchar *argv[])
    {
      
    FILE *ot,*no;
      
    FILE *otno;
      
    /*apertura dei due file*/
      
    ot=fopen("ottanta.dat","r+");
      
    no=fopen("novanta.dat","r+");
      
    /*se non si posso aprire*/
      
    if(ot==NULL || no==NULL)
      {
                 
    puts("Uno dei due file non puo essere aperto");
                 exit(
    1);
      }
    fread(&Anni80,sizeof(Anni_80),1,ot);
    fread(&Anni90,sizeof(Anni_90),1,no);

    otno=fopen("ottnov.dat","w+");
    CreaPlaylist(ot,no);
    fwrite(&otno,sizeof(otno),1,otno);
    fclose(otno);
    fclose(ot);
    fclose(no);
    system("PAUSE");    
    return 
    0;
    }
    /*creamo la procedura per creare una playlist unica a partire dalle precedenti*/
    void CreaPlaylist(ot,no)
    {
        
    char ot,no;
        
    char scat;
        if(
    strcmp(ot,no)<=0)
        {
                           
    strcpy(scat,ot);
                           
    strcat(scat,no);
    }
         else
         {
             
    strcpy(scat,no);
             
    strcat(scat,ot);
         }


  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ok ... ma la 3) non l'hai fatto ... l'hai scambiato con la 4) ... continuando ...

    7) perche' leggi *solamente* il primo elemento dei due file nel main? E il resto?

    8) attenzione alla fwrite ... il primo parametro passato non ha senso ... non hai creato la playlist risultato (da 200 elementi)

    9) perche' scrivi *solamente* un elemento con la fwrite ? E il resto ?

    10) la CreatePlayList deve accettare i 3 puntatori ai vettori di strutture ... quindi il *prototipo* sara'

    void CreaPlaylist(Anni_80 *pla80, Anni_90 *pla90, Anni_8090 *pla8090) ;

    (l'ultima struttura, Anni_8090, non esiste ancora nel tuo programma ...)

    All'interno della funzione, tramite i puntatori dei vettori di strutture, dovrai copiare gli elementi delle prime due playlist nella terza ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Originariamente inviato da oregon
    Ok ... ma la 3) non l'hai fatto ... l'hai scambiato con la 4) ... continuando ...

    7) perche' leggi *solamente* il primo elemento dei due file nel main? E il resto?

    8) attenzione alla fwrite ... il primo parametro passato non ha senso ... non hai creato la playlist risultato (da 200 elementi)

    9) perche' scrivi *solamente* un elemento con la fwrite ? E il resto ?

    10) la CreatePlayList deve accettare i 3 puntatori ai vettori di strutture ... quindi il *prototipo* sara'

    void CreaPlaylist(Anni_80 *pla80, Anni_90 *pla90, Anni_8090 *pla8090) ;

    (l'ultima struttura, Anni_8090, non esiste ancora nel tuo programma ...)

    All'interno della funzione, tramite i puntatori dei vettori di strutture, dovrai copiare gli elementi delle prime due playlist nella terza ...
    Il 3) l'ho risolto cosi:

    Codice PHP:
    if((ot=fopen("ottanta.dat","r+"))==NULL)
    return 
    ERROR;
      if((
    no=fopen("novanta.dat","r+"))==NULL)
    return 
    ERROR
    mettendo prima del main:
    Codice PHP:
    #define ERROR 0 
    per il 7) 8) e 9) in che senso *solamente*?

  6. #6
    Sono arrivato a questo punto..non so ancora dove sbaglio VVoVe:
    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <stddef.h>
    #include <string.h>
    #define ERROR 0
    typedef struct {
            
    char Titolo[20];
            
    char Autore[20];
            
    char Album[20];
            
    int Durata;
            } 
    Anni_80Anni_90Anni_8090;
            
    Anni_80 Anni80[100];
    Anni_90 Anni90[100];
    Anni_8090 Anni8090[200];
    void CreaPlaylist(Anni_80 *pla80Anni_90 *pla90Anni_8090 *pla8090); /*prototipo della procedura*/
    int main(int argcchar *argv[])
    {
      
    FILE *ot,*no;
      
    FILE *otno;

      if((
    ot=fopen("ottanta.dat","r+"))==NULL)
    return 
    ERROR;
      if((
    no=fopen("novanta.dat","r+"))==NULL)
    return 
    ERROR;
                                              
    fread(&Anni80,sizeof(Anni_80),1,ot);
    fread(&Anni90,sizeof(Anni_90),1,no);

    if((
    otno=fopen("ottnov.dat","w+"))==NULL);
    return 
    ERROR;

    CreaPlaylist(Anni80,Anni90,Anni8090);
    fwrite(&Anni8090,sizeof(Anni_8090),1,otno);
               

    /*chiusura file*/
    fclose(otno);
    fclose(ot);
    fclose(no);
    system("PAUSE");    
    return 
    0;
    }
    /*creamo la procedura per creare una playlist unica a partire dalle precedenti*/
    void CreaPlaylist(Anni_80 *pla80Anni_90 *pla90Anni_8090 *pla8090)
    {
        
    char *ot,*no;
        
    char *scat;
        if(
    strcmp(ot,no)<=0)
        {
                           
    strcpy(scat,ot);
                           
    strcat(scat,no);
    }
         else
         {
             
    strcpy(scat,no);
             
    strcat(scat,ot);
         }

    Help!

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da luanlombardi
    Il 3) l'ho risolto cosi: ...
    No ...

    Il punto 3) riguardava il controllo della corretta apertura del file in scrittura ...
    L'uscita, comunque, non puo' avvenire con la costante ERRORE uguale a 0 perche' 0 e' il valore che usi comunque alla fine per segnalare che il programma e' terminato normalmente ... devi quindi scegliere un altro valore per la costante ERRORE ...

    per il 7) 8) e 9) in che senso *solamente*?
    Nel senso che le fread e la fwrite riguardano solamente il primo elemento della struttura ... e *tutti gli altri* quando li leggi (e li scrivi)?

    All'interno della funzione, infine, perche' scrivi quelle istruzioni ? Spiegale ... perche' non capisco a cosa servano una per una ... (te lo avevo gia' detto prima) ...

    Hai degli argomenti in ingresso (i 3 puntatori) ... devi lavorare con quelli per fare quello che e' richiesto dall'esercizio al punto b).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.