Passare FILE a funzione void

di il
12 risposte

Passare FILE a funzione void

Salve, non riesco davvero a capacitarmi.
Premetto che non sono un esperto, e sono soltanto un ragazzo che inizia ad imparare.
Comunque vorrei riuscire a passare lo stream aperto di un file ad una funzione.
Nel senso che ho una funzione che deve operare su un file già aperto, e che non vorrei chiudere e riaprire inutilmente. Quindi ho lo stream del file aperto, ed una funzione nel corpo del while che riguarda il dato file.
Vabbè ecco un esempio:

using namespace std;

FILE *pf;
FILE *pd;

void add_new_student(FILE, FILE);

int main ()
{
    int matricola_studente;
    char nome_studente[20];
    char cognome_studente[20];
    
    int opzione=0;
    
       
    cout<<"...\n";
    cout<<"...\n\n";
    
    int o=getch();
    if(o==13)//se clicca invio
    {   
       
    pf = fopen("Studenti.txt", "r");
    if(pf==NULL){
       cout<<"Impossibile aprire il file\n";
      system("pause");
       exit(1);
       }
       
      
    pd = fopen("Esami.txt", "r+");
    if(pd==NULL){
       cout<<"Impossibile aprire il file\n";
      system("pause");
       exit(1);
       }
       
       cout<<"Lettura Studenti.txt"<<endl<<endl;
    while(!feof(pf)){  //studenti.txt
       
       fscanf(pf,"%d ",&matricola_studente);
       cout<<matricola_studente<<" | ";
       fscanf(pf,"%s ",nome_studente);
       cout<<nome_studente<<" ";
       fscanf(pf,"%s ",cognome_studente);
       cout<<cognome_studente<<endl;
       
       cout<<"\nMENU OPZIONI\n\n";
       cout<<"1 - Inserire nuovi studenti\n";
       cout<<"2 - Inserire i risultati di nuovi esami effettuati dagli studenti presenti nell'elenco\n";
       cout<<"3 - Stampare tutti gli esami eseguiti da uno studente e la relativa media\n";
       cout<<"4 - Stampare tutti gli studenti che hanno eseguito un certo esame\n";
       cout<<"0 - Esci!\n";
       
       cin>>opzione;
       switch(opzione){
       case 0:
            return 0;
            break;
       case 1:
            add_new_student(pf, pd);
            break;
       case 2:
            add_new_exam();
            break;
       case 3:
            show_exam();
            break;
       case 4:
            show_an_exam();
            break;
       default:
            cout<<"\nOpzione non disponibile\n";
            break;
                      }
                      
                      
                  //Chiusura WHILE studenti.txt
                     fclose(pf);    
                      //Chiusura WHILE esami.txt
                           fclose(pd);
                           
    }
    
    ...
    cout<<endl;
system("pause");
return EXIT_SUCCESS;
    }



void add_new_student(FILE *pf,FILE *pd){
     
     ...
     
     }

Grazie per il tempo dedicatomi

12 Risposte

  • Re: Passare FILE a funzione void

    Ma il problema qual è ?
  • Re: Passare FILE a funzione void

    Ciao,
    sono d'accordo con oregon: il problema non è molto chiaro. Comunque, se vuoi solo sapere come passare un "file" a una funzione, ti lascio un esempio molto banale:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    void funzione(FILE *fp)
    {
        fprintf(fp, "%s\n", "Seconda stringa");
    }
    
    int main()
    {
        FILE *fp = fopen("file.txt", "w");
    
        fprintf(fp, "%s\n", "Prima stringa");
    
        funzione(fp);
    
        fclose(fp);
    
        return 0;
    }
    
    
    Se provi ad eseguirlo troverai il file "file.txt" contenente entrambe le stringhe.

  • Re: Passare FILE a funzione void

    Il fatto è che il codice che ha proposto lo fa già ... quindi non capisco a meno che non dia qualche spiegazione in più
  • Re: Passare FILE a funzione void

    Io avevo visto questo prototipo nel suo codice:
    void add_new_student(FILE, FILE);
    dove mancano gli asterischi per indicare i puntatori a FILE. Non so se possa essere quello il problema. Anche perché poi nell'implmentazione della funzione ha scritto correttamente.
  • Re: Passare FILE a funzione void

    Il problema è che da errore, scusate se nn lho detto
    Ecco l'errore:

    92 I:\...\Gestione.cpp conversion from `FILE*' to non-scalar type `FILE' requested

    Si comunque mi pare di aver scritto correttamente, lho ricontrollato mille volte ma da comunque quell'errore assurdo
  • Re: Passare FILE a funzione void

    Dovresti indicare esattamente qual è la riga che genera quell'errore. Il compilatore la riporta sicuramente.
  • Re: Passare FILE a funzione void

    Indica questa riga: add_new_student(pf, pd);
  • Re: Passare FILE a funzione void

    In effetti scrivi questo nel prototipo all'inizio

    void add_new_student(FILE, FILE);

    e questo nella funzione


    void add_new_student(FILE *pf,FILE *pd){

    Ovviamente la prima riga deve essere

    void add_new_student(FILE *, FILE *);
  • Re: Passare FILE a funzione void

    Esatto, è proprio quello che intendevo. Però il compilatore non lo dovrebbe segnalare come warning?
  • Re: Passare FILE a funzione void

    Ok grazie ho risolto
  • Re: Passare FILE a funzione void

    Ah ma ecco! Io e oregon intendevamo che devi correggere il prototipo all'inizio del codice. In quel punto invece devi passare proprio i puntatori a FILE, quindi qualcosa come
    add_new_student(fp, fd);
  • Re: Passare FILE a funzione void

    Si grazie avevo frainteso. Grazie mille, davvero grazie mille!
Devi accedere o registrarti per scrivere nel forum
12 risposte