Gestione dei file in C/C++
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 9 di 9

Discussione: Gestione dei file in C/C++

Cambio titolo
  1. #1
    alnews
    Ospite

    Gestione dei file in C/C++

    Salve ragazzi, avrei un quesito da porvi.
    Le prove finali per l'esame di Fondamenti di Informatica richiedono sempre l'uso dei file .txt per la gestione dell' input/output. Il nostro professore ci ha spiegato sia come si gesticono i file di testo in C, sia in C++ (nel primo con le funzioni e nel secondo con le classi). Però, nelle prove d'esempio che sto visionando ora, nonostante il sorgente sia in estensione .cpp (ed in effetti, è scritto in C++), la parte che riguarda la gestione dei file è interamente scritta in C. Quel che mi chiedevo era:

    - È possibile usare promiscuamente codice C o C++ senza problemi all'interno del programma?

    - Per le funzioni che gestiscono i file in C, è rilevante l'uso di <stdlib.h> (l'unica altra libreria inclusa insieme a <iostream>)?

    Per farvi un esempio, ecco come è definita una funzione che si occupa di leggere una matrice da file .txt:

    Codice PHP:
    void leggi_mat(matrice Mint &rigaint &colonna, const char *nomefile){
      
    int i,j;
      
    FILEfp=fopen(nomefile,"r");
      
      if(
    fp==0){
        
    cout<<"Errore nell'apertura del file";
        
    system("PAUSE");
        exit(
    1);
      } 
      
    fscanf(fp"%d", &riga);
      
    fscanf(fp"%d", &colonna);
      for (
    i=0;i<riga;i++)
        for(
    j=0;j<colonna;j++)
          
    fscanf(fp"%d", &M[i][j]);  

    Come vedete all'interno della funzione ci sono le funzioni del C riservate alla gestione dei file. Avrei anche un altro paio di dubbi:

    - Il file da cui si legge (e anche quando si scrive?) va dichiarato quindi nella funzione come const char? Perché l'asterisco (puntatore?) ?

    - Il file in realtà nella cartella si chiama Mat.txt, ma qui è nomefile. Ho controllato negli altri moduli, non ci sono dei typedef o simili. È un errore o se no come spiega? (purtroppo non posso attualmente controllare se genera errore in compilazione)

    - Le variabili sono già passate per riferimento nella dichiarazione della funzione, è davvero necessario aggiungere "&" anche dopo? Non mi pare di averlo mai fatto.

    Scusate la lunghezza e grazie davvero un miliardo a chi saprà rispondermi. ( :

  2. #2
    da 3? L'avatar di Celebron
    Registrato il
    07-06
    Località
    Sotto Canestro
    Messaggi
    14.462
    Citazione alnews Visualizza Messaggio

    - Per le funzioni che gestiscono i file in C, è rilevante l'uso di <stdlib.h> (l'unica altra libreria inclusa insieme a <iostream>)? si


    - Il file da cui si legge (e anche quando si scrive?) va dichiarato quindi nella funzione come const char? Perché l'asterisco (puntatore?) ?è passato da un altra funzione. Come const probabilmente perchè non vuoi che venga modificato (in realtà potresti anche evitare). L'asterisco serve per indicare che è una stringa. Se fosse stato solo char nomefile, nomefile sarebbe stato un unico carattere

    - Il file in realtà nella cartella si chiama Mat.txt, ma qui è nomefile. Ho controllato negli altri moduli, non ci sono dei typedef o simili. È un errore o se no come spiega? (purtroppo non posso attualmente controllare se genera errore in compilazione) nomefile è la variabile char* contenente il nome del file che sicuramente ha acquisito in precedenza con una scanf. Se fosse stato un nome di un file sarebbe stato scritto tra virgolette, ex "Mat.txt"

    - Le variabili sono già passate per riferimento nella dichiarazione della funzione, è davvero necessario aggiungere "&" anche dopo? Non mi pare di averlo mai fatto. edit: temo un attimo di non aver capito la tua domanda, a quale parte del codice ti stai riferendo?

    Scusate la lunghezza e grazie davvero un miliardo a chi saprà rispondermi. ( :
    *
    Ultima modifica di Celebron; 15-01-2010 alle 00:11:12

  3. #3
    alnews
    Ospite
    Citazione celebron Visualizza Messaggio
    Citazione alnews Visualizza Messaggio
    - per le funzioni che gestiscono i file in c, è rilevante l'uso di <stdlib.h> (l'unica altra libreria inclusa insieme a <iostream>)? > si >> Ok, <cstdlib> dovrebbe essere la nuova versione vero?


    - il file da cui si legge (e anche quando si scrive?) va dichiarato quindi nella funzione come const char? Perché l'asterisco (puntatore?) ?> è passato da un altra funzione. Come const probabilmente perchè non vuoi che venga modificato (in realtà potresti anche evitare). L'asterisco serve per indicare che è una stringa. Se fosse stato solo char nomefile, nomefile sarebbe stato un unico carattere

    - il file in realtà nella cartella si chiama mat.txt, ma qui è nomefile. Ho controllato negli altri moduli, non ci sono dei typedef o simili. è un errore o se no come spiega? (purtroppo non posso attualmente controllare se genera errore in compilazione) > nomefile è la variabile char* contenente il nome del file che sicuramente ha acquisito in precedenza con una scanf. Se fosse stato un nome di un file sarebbe stato scritto tra virgolette, ex "mat.txt"

    >> Hai ragione, non avevo fatto caso che nel main alla funzione il nome del file è passato tra i parametri xd. Quindi dichiarandolo come stringa (es. Nomefile) immagino che, alla chiamata, il parametro non possa essere più lungo di nomefile, giusto?

    - le variabili sono già passate per riferimento nella dichiarazione della funzione, è davvero necessario aggiungere "&" anche dopo? Non mi pare di averlo mai fatto. > edit: Temo un attimo di non aver capito la tua domanda, a quale parte del codice ti stai riferendo? >> Praticamente, nella funzione che ho postato come esempio, &riga e &colonna sono passati per riferimento, ma ciò viene "specificato" anche dopo, nel corpo della funzione, aggiungendo di nuovo "&" davanti a riga e colonna ogni volta che vengono usate queste variabili. Credo che sia opzionale però, perché ho controllato e nei miei sorgenti se passavo delle variabili per riferimento usavo il "&" solo all'inizio.
    Grazie mille per l'aiuto. ( :

    P.S. Quindi posso presumere che non ci siano problemi nell'usare codice C o C++ nello stesso programma?

  4. #4
    StorieDallaSalaMacchine L'avatar di miniBill '90
    Registrato il
    08-05
    Località
    Bergerac
    Messaggi
    4.204
    Citazione alnews Visualizza Messaggio
    Grazie mille per l'aiuto. ( :

    P.S. Quindi posso presumere che non ci siano problemi nell'usare codice C o C++ nello stesso programma?
    in realtà ci sono problemi
    ma probabilmente non li incontrerai
    p.s.: i problemi si hanno nel mischiare CODICE c e c++, non funzioni di libreria c e c++, le quali funzionano allegramente insieme

    ESISTE UN UNICO AMMINISTRATORE
    Quoto-thisisgorman-
    (La mi ex-firma sta qua)

  5. #5
    alnews
    Ospite
    Citazione miniBill '90 Visualizza Messaggio
    in realtà ci sono problemi
    ma probabilmente non li incontrerai
    p.s.: i problemi si hanno nel mischiare CODICE c e c++, non funzioni di libreria c e c++, le quali funzionano allegramente insieme
    Mmm, cos'è considerato "codice" allora?

  6. #6
    StorieDallaSalaMacchine L'avatar di miniBill '90
    Registrato il
    08-05
    Località
    Bergerac
    Messaggi
    4.204
    Codice PHP:
    //a.h
    int a(int b);
    double a(double d);
    //a.cpp
    int a(int b){
    return 
    b*2;
    }
    double a(double d){
    return 
    d/2D;
    }
    //b.h
    float a(float f);
    //b.cpp
    float a(float f){
    return 
    f*3.5F
    }
    //main.c
    #include "a.h"
    #include "b.h"

    int main(){

    se non ricordo male chiamare a(3.5F) in main() potrebbe causare problemi nel link

    ESISTE UN UNICO AMMINISTRATORE
    Quoto-thisisgorman-
    (La mi ex-firma sta qua)

  7. #7
    alnews
    Ospite
    Citazione miniBill '90 Visualizza Messaggio
    Codice PHP:
    //a.h
    int a(int b);
    double a(double d);
    //a.cpp
    int a(int b){
    return 
    b*2;
    }
    double a(double d){
    return 
    d/2D;
    }
    //b.h
    float a(float f);
    //b.cpp
    float a(float f){
    return 
    f*3.5F
    }
    //main.c
    #include "a.h"
    #include "b.h"

    int main(){

    se non ricordo male chiamare a(3.5F) in main() potrebbe causare problemi nel link
    Ok penso di aver capito, ma non credo che arriverò mai a simili livelli di caos xd. Per quanto riguarda le domande nel mio secondo quote cosa sapete dirmi?
    Inoltre, il docente ci ha detto di non lasciare il file .h, dove inseriamo i prototipi delle funzioni, all'interno della finestra del progetto di Dev-C++ (immagino il discorso sia applicabile a qualsiasi IDE) ma di toglierlo subito una volta finito di scriverlo, pena la perdita di qualche punto nella prova. Come mai? (Cioè c'è una ragione dietro, no? )

  8. #8
    alnews
    Ospite
    Allora ragazzi, l'esercitazione continua e sto avendo alcuni problemi. Uno di questi riguarda la creazione di un array di strutture. Riassumendo, il mio programma deve, avuta in input una matrice da file .txt, e da tastiera un valore K, creare un vettore di strutture, in cui per ogni elemento della matrice maggiore di K sia ha un record con due campi di tipo intero, rappresentanti l'indice della riga e della colonna dell'elemento considerato. La funzione inoltre deve restituire un valore booleano vero/falso a seconda che il vettore sia vuoto/pieno.E poi far stampare il vettore ottenuto su file. Il tutto dividendo in moduli.

    Ora, ecco come avevo affrontato la cosa:

    (header):
    Codice PHP:
    // File Header

    const int MAX=50;
    typedef int matrice[MAX][MAX];

    void leggi_mat(matrice&, int&, const char*);
    void crea_vett_ind(matriceintbool&); 
    (file delle funzioni):
    Codice PHP:
    // Funzioni
    #include <iostream>
    #include <cstdlib>
    #include "lib.h"
    using namespace std;

    // Funzione per la lettura della matrice

    void leggi_mat(matrice &Mint &riemp, const char *nomefile){
         
    int ij;
         
    FILEfp=fopen(nomefile,"r");
         
         if (
    fp==0){
                    
    cout << "Errore nell'apertura del file!";
                    
    system("PAUSE");
                    exit(
    1);
         }
         
         
    fscanf(fp"%d", &riemp);
         
         for(
    0riempi++)
               for(
    0riempj++)
                     
    fscanf(fp"%d", &M[i][j]);
    }
         
    // Funzione per la creazione del vettore

    void crea_vett_ind(const matrice Mint riempbool &tmp_trovato){
         
    int n 0ijK;
         
         
    struct indice {
                
    int rig;
                
    int col;
         };
         
         
    indice vett_ind[50];
         
         
    cout << "\nInserisci il valore di K: ";
         
    cin >> K;
         
         for (
    0riempi++)
             for (
    0riempj++)
                    if (
    M[i][j] > K){
                       
    vett_ind[n].rig M[i];
                       
    vett_ind[n].col M[j];
                       
    n++;
             }
         
         if (
    vett_ind[0].rig != M[0]) 
            
    tmp_trovato false;
            else 
    tmp_trovato true;

    (main):
    Codice PHP:
    // Main

    #include <iostream>
    #include <cstdlib>
    #include "lib.h"

    using namespace std;

    int main(){
        
    matrice mat;
        
    int riemp;
        
    bool trovato;
        
        
    leggi_mat(matriemp"mat.txt");
        
    crea_vett_ind(matriemptrovato);
        
        if (
    trovato == true)
                    
    cout << "true";
        else 
    cout << "false";
        
        
    system("PAUSE");

    Manca la funzione per stampare il vettore, ma non è importante per ora.
    Ovviamente non compila.

    Mi da:

    Codice:
    Compilatore: Default compiler
    Building Makefile: "H:\DocZ\Uni (new)\Fondamenti di Informatica\Prove d'esame\Prova n. 3 risolta\Makefile.win"
    Esecuzione di  make...
    make.exe -f "H:\DocZ\Uni (new)\Fondamenti di Informatica\Prove d'esame\Prova n. 3 risolta\Makefile.win" all
    g++.exe -c lib.cpp -o lib.o -I"D:/Programmi/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"D:/Programmi/Dev-Cpp/include/c++/3.4.2/backward"  -I"D:/Programmi/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"D:/Programmi/Dev-Cpp/include/c++/3.4.2"  -I"D:/Programmi/Dev-Cpp/include"  -I"D:/Programmi/SDL-1.2.14/include"   
    
    lib.cpp: In function `void crea_vett_ind(const int (*)[50], int, bool&)':
    lib.cpp:44: error: invalid conversion from `const int*' to `int'
    lib.cpp:45: error: invalid conversion from `const int*' to `int'
    
    lib.cpp:49: error: ISO C++ forbids comparison between pointer and integer
    
    make.exe: *** [lib.o] Error 1
    
    Esecuzione terminata
    Da cui deduco di non aver dichiarato per bene il vettore. È così? xd Mi potete dare una mano per piacere? xd Inoltre, il codice secondo voi dovrebbe funzionare o ho combinato altre porcate? Stavo pensando, invece di void crea_vett_ind dovrei dichiararla come bool e farle returnare tmp_trovato oppure va bene così?

    Scusate la lunghezza e scusate se ho detto stronzate madornali ma il tempo stringe e potrei non ragionare correttamente.

    Grazie in ogni caso!

  9. #9
    Utente L'avatar di marcelloma
    Registrato il
    01-08
    Località
    Palermo
    Messaggi
    4.083
    Citazione miniBill '90 Visualizza Messaggio
    in realtà ci sono problemi
    ma probabilmente non li incontrerai
    p.s.: i problemi si hanno nel mischiare CODICE c e c++, non funzioni di libreria c e c++, le quali funzionano allegramente insieme
    Ma relativamente in realtà, hanno fatto in modo che il c sia un subset del c++ e i problemi di compatibilità ci sono solo per cose molto complesse che non ricordo ma che penso si usino sporadicamente.

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •