[C++] Allocazione dinamica file

di il
7 risposte

[C++] Allocazione dinamica file

Buonasera a tutti quelli che leggeranno (e non risponderanno a) questo post , chiedo aiuto riguardo due problemini sui file.
1) Devo effettuare il caricamento di una matrice da file in cui le prime due righe contengono la dimensione delle righe e colonne, esempio:
4
4
8 2 1 4
0 2 0 2
0 0 8 1
0 0 0 2
La matrice deve essere allocata dinamicamente quindi, i miei passaggi sono:
a) apro il file, ne ricavo la dimensione e chiudo il file;
b) alloco il tipo nel main;
c) riapro il file per poter caricarne il contenuto e poi lo chiudo.
Fin qui ci siamo, ma nel terzo passaggio, avendo chiuso il file precedentemente e riaprendolo, la lettura del file avviene di nuovo dalla prima riga e quindi, nella matrice vengono inserite anche le due dimensioni delle righe e delle colonne. Per il momento ho ovviato il problema (molto furbamente direi eheh) ricavando nuovamente le dimensioni così:
void ins_matrice(char nomeFile[],float **Matrice,int r,int c){
	fstream File;
	File.open(nomeFile,ios::in);
	File >> r; ---> PASSAGGI INCRIMINATI
	File >> c; ---> PASSAGGI INCRIMINATI
	for(int i=0;i<r;i++){
		for(int j=0;j<c;j++){
			File >> Matrice[i][j];
		}
	}
	File.close();
}
Vorrei sapere se c'è un modo per evitare tutto ciò, indicando che bisogna acquisire gli elementi da una tot riga. Grazie mille

2) Stavo pensando... e se la dimensione non venisse specificata nel file e la matrice fosse di dimensione ignota, come dovrebbe avvenire l'acquisizione delle dimensioni della matrice per effettuare l'allocazione dinamica?
Attraverso un while(!File.eof()) l'acquisizione avviene per elementi, dovrei quindi effettuare l'acquisizione delle righe come se fossero delle stringhe, cosicché letto un intero rigo, incremento la dimensione r? E per le colonne, poi? Vorrei un suggerimento perché non saprei proprio come muovermi. Grazie mille di nuovo

7 Risposte

  • Re: [C++] Allocazione dinamica file

    Passa l’oggetto ifstream per riferimento alla funzione.

    Per il secondo punto potresti leggere linee finché il file raggiunge EOF. La lunghezza del vettore è il numero delle righe. Successivamente tokenizzi la prima stringa, il numero dei token è il numero delle colonne. Successivamente passi a riempire la matrice con i token per tutte le stringhe.
  • Re: [C++] Allocazione dinamica file

    Prima di tutto, perché apri due volte il file? Puoi aprirlo, leggere r e c, allocare la matrice e leggere, poi chiudere, tutto una sola volta.

    Comunque, per rispondere al primo quesito, potresti segnare la posizione con il metodo tellg e poi posizionarti nello stesso punto dopo la riapertura con il metodo seekg.

    Per la seconda, acquisisci l'intera riga (così avrai un contatore di righe) fino all'eof. E con la stringstream (già dalla prima) tokenizzi i vari campi contandoli.
  • Re: [C++] Allocazione dinamica file

    Okay, allora a quanto pare sono io che sto pensando troppo avanti perché è l'esame di Fondamenti di Informatica!
    Quindi, convengo che per il momento l'ideale sarebbe, se la dimensione è specificata nel file, effettuare apertura/allocazione/lettura e chiusura in un'unica funzione, in modo tale da non perdere il "segno" nel file. Proverò ad usare tellg/seekg giusto per curiosità!
    Il caso di dimensione non specificata invece, è improbabile che si presenti all'esame (i token non sono nel programma). Tutt'al più, una condizione che potrebbe avvicinarsi è che venga specificata solo una dimensione nel file oppure sarà resa nota nella traccia, così da poter calcolare l'altra, condizione che dovrei essere in grado di affrontare. Grazie mille ad entrambi per i dubbi chiariti
  • Re: [C++] Allocazione dinamica file

    Non hai esempi d'esame? Non variano molto... Le tellg/seekg non dovrebbe esserci in fondamenti. Quando l'esame?
  • Re: [C++] Allocazione dinamica file

    Venerdì poi continuerò ad importunarvi quando sarà il tempo di imparare la programmazione orientata agli oggetti
    Ritornando al thread, gli esempi ce l'ho e li ho già svolti tutti, ma cerco comunque di cambiare le tracce e affrontare nuovi problemi, così da non svolgere sempre lo stesso compitino e "imparare la pappardella a memoria". Comunque, grazie di nuovo!
  • Re: [C++] Allocazione dinamica file

    Io la soluzione che non modifica manualmente la posizione nel buffer te l’ho data…
  • Re: [C++] Allocazione dinamica file

    Sì, scusami Achille, ho dimenticato di aggiungere che il mio prof l'oggetto ifstream lo definisce sempre e solo localmente nei sottoprogrammi. Proverò comunque ad usare il tuo suggerimento e se avrò problemi, riscriverò qui
Devi accedere o registrarti per scrivere nel forum
7 risposte