[C++] lettura e scrittura su file

irelimax
Ciao a tutti!

Ho un problema sull'esecuzione del seguente programma:

 /*Scrivere un programma che chiede all'utente il nome di un file che contiene
solo numeri interi, dopo aver stampato "Inserisci il nome del file". 
Il programma chiama una funzione che conta il numero 
di elementi nel file. Il programma carica i numeri presenti nel file
in un vettore. Il programma applica una seconda funzione ad ogni valore
presente nell'array: la funzione scrive il numero in senso contrario
(i.e. il numero 12345 deve diventare 54321).
Infine il programma scrive i dati dell'array, a partire dall'ultimo
nel file "reverse.txt".

Mettere newline in modo che tutto sia leggibile
ed indentare correttamente il codice.
*/

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>

using namespace std;

int conta_i_numeri(string,int[]);
int conteggio=0;
void reverse(int[]);
int i=0;

    

int main()
{
      
    string nome_file;
    cout << "inserisci il nome del file: " ;
    cin >> nome_file;
    
    int vett[100];
    
     
    conteggio=conta_i_numeri(nome_file,vett); //inFile è il parametro attuale quello che gli passo io 

    reverse(vett) ;
    
    system("PAUSE");
    return 0;
}

int conta_i_numeri(string nome_file,int vett[]) //file è parametro formale  quello che scrivo nel prototipo 
{
    ifstream inFile;
    
    inFile.open("nome_file");
    int i =0;
     while(inFile >> vett[i])
    {
        i++;
        conteggio++;

    }        
    inFile.close();
}
        
void reverse(int vett[])
{
    ofstream outFile;
    outFile.open("reverse.txt");
    int reverse=0;
    
    for (int j=conteggio-1;j>=0;j--) 
    {
        outFile<<reverse<< " ";
        reverse=vett[j];
    }
     outFile.close();
} 



Testando il codice mi accorgo che non riempe il vettore "vett" durante la lettura del file.
Qualcuno saprebbe aiutarmi?

Grazie inifinite

Risposte
vict85
Una curiosità veloce, perché usi string per le stringhe anche se un array di char era probabilmente più che sufficiente (circa 256 caratteri dovrebbe essere sufficiente per i tuoi usi) mentre usi un array di int per contenere gli interi quando il file potrebbe contenere potenzialmente moltissimi interi. A mio avviso usare un vector è più sensato. Anche perché non stai neanche passando la dimensione dell'array nelle varie funzioni.

Ho notato tra l'altro che tu non stai invertendo gli elementi dell'array (12345 -> 54321).

ulven101
"irelimax":
Ciao a tutti!
 /*Scrivere un programma che chiede all'utente il nome di un file che contiene
solo numeri interi, dopo aver stampato "Inserisci il nome del file". 
Il programma chiama una funzione che conta il numero 
di elementi nel file. Il programma carica i numeri presenti nel file
in un vettore. Il programma applica una seconda funzione ad ogni valore
presente nell'array: la funzione scrive il numero in senso contrario
(i.e. il numero 12345 deve diventare 54321).
Infine il programma scrive i dati dell'array, a partire dall'ultimo
nel file "reverse.txt".

Mettere newline in modo che tutto sia leggibile
ed indentare correttamente il codice.
*/

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>

using namespace std;

int conta_i_numeri(string,int[]);
int conteggio=0;
void reverse(int[]);
int i=0;

    

int main()
{
      
    string nome_file;
    cout << "inserisci il nome del file: " ;
    cin >> nome_file;
    
    int vett[100];
    
     
    conteggio=conta_i_numeri(nome_file,vett); //inFile è il parametro attuale quello che gli passo io 

    reverse(vett) ;
    
    system("PAUSE");
    return 0;
}

int conta_i_numeri(string nome_file,int vett[]) //file è parametro formale  quello che scrivo nel prototipo 
{
    ifstream inFile;
    
    inFile.open("nome_file");
    int i =0;
     while(inFile >> vett[i])
    {
        i++;
        conteggio++;

    }        
    inFile.close();
}
        
void reverse(int vett[])
{
    ofstream outFile;
    outFile.open("reverse.txt");
    int reverse=0;
    
    for (int j=conteggio-1;j>=0;j--) 
    {
        outFile<<reverse<< " ";
        reverse=vett[j];
    }
     outFile.close();
} 


Quale compilatore stai usando? Dovrebbe comparirti almeno qualche warning: la funzione conta_i_numeri non ritorna alcun valore! Nel momento in cui fai
conteggio=conta_i_numeri(nome_file,vett);
la variabile (globale) conteggio viene modificata con un valore che non conosci.
Io sistemerei così la funzione conta_i_numeri
/* questa funzione deve diventare una procedura che non ritorna alcun valore, nel caso in cui tu voglia continuare ad usare la variabile globale conteggio (ti consiglio di eleborare un soluzione più solida) */
void conta_i_numeri(string nome_file,int vett[])
{
    ifstream inFile;
    
    inFile.open("nome_file");
    while(inFile.good())
    {
        inFile >> vett[conteggio]
        conteggio++;

    }        
    inFile.close();
}

Per poi richiamarla nel main semplicemente così
conta_i_numeri(nome_file,vett);


Ovviamente la seconda funzione fa una cosa completamente diversa dalla consegna dell'esercizio, ma intanto spero di averti chiarito questo primo passaggio.

vict85
Sinceramente trovo che nel 99,99999% dei casi, usare variabili globali provochi più problemi di quanti ne risolva. Quindi elimina quelle due variabili globali (anche perché sembra che si sovrappongano come uso). Tra l'altro hai creato una variabile i locale, mascherando quella globale. Se il tuo scopo NON è quello di offuscare il codice direi che questo tipo di cose sono da evitare. Per esempio io guardando velocemente non mi ero accorto della presenza della variabili globali.

Come regola generale dovresti cercare di creare una variabile solo dove serve e far capire bene al compilatore dove non serve.

Comunque il tuo codice è incompleto. Ti invito a leggere per bene le richieste del tuo professore: manca la parte in cui inverti il numero.

irelimax
"ulven101":
Quale compilatore stai usando? Dovrebbe comparirti almeno qualche warning: la funzione conta_i_numeri non ritorna alcun valore! Nel momento in cui fai
conteggio=conta_i_numeri(nome_file,vett);
la variabile (globale) conteggio viene modificata con un valore che non conosci.
Io sistemerei così la funzione conta_i_numeri
/* questa funzione deve diventare una procedura che non ritorna alcun valore, nel caso in cui tu voglia continuare ad usare la variabile globale conteggio (ti consiglio di eleborare un soluzione più solida) */
void conta_i_numeri(string nome_file,int vett[])
{
    ifstream inFile;
    
    inFile.open("nome_file");
    while(inFile.good())
    {
        inFile >> vett[conteggio]
        conteggio++;

    }        
    inFile.close();
}

Per poi richiamarla nel main semplicemente così
conta_i_numeri(nome_file,vett);


Ovviamente la seconda funzione fa una cosa completamente diversa dalla consegna dell'esercizio, ma intanto spero di averti chiarito questo primo passaggio.


Mi è chiaro tutto quello che hai scritto ma non capisco perchè la funzione reverse non scrive i numeri in ordine inverso.
Queste due righe non scrivono nel file "reverse.txt" i numeri presenti nel vettore a partire dall'ultimo elemento presente nel vettore?
outFile<<reverse<< " ";
        reverse=vett[j];

ulven101
Sì, ma a quanto ho letto sopra, non è quella la consegna.

vict85
Ogni volta che vedo il tuo codice trovo errori grossolani sempre maggiori. Hai chiamato una variabile locale di una funzione come la funzione stessa!? Sono stupito compili. Comunque quel codice che hai scritto NON fa quello che penso ti pensi faccia.

Sinceramente comincio a pensare che tu abbia serie carenze in termini di comprensione delle strutture base del linguaggio e probabilmente del modo in cui la memoria viene gestita. Il mio suggerimento è rivederti i codici più semplici ed essere sicuro di capirli. Tra l'altro esiste una funzione chiamata reverse nel namespace std.

Riguardo al reverse devi caricare il numero in un array di caratteri (o se preferisci in una stringa) e inserire i caratteri in ordine inverso nel file.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.