PDA

Visualizza la versione completa : [c++] finestra selezione file


sandrinolli
21-05-2010, 15:48
float * matrice;
FILE* inFile;
int i,j;
int width=0,height=0;

inFile = fopen("ciao.txt","r");
if(inFile==NULL) {
OpenSteer::OpenSteerDemo::errorExit("Impossibile aprire il File per il caricamento dei dati :\n");
}
//leggi i valori di righe e colonne
if(fscanf(inFile,"%d %d",&height,&width)!=2)
{
OpenSteer::OpenSteerDemo::errorExit("Impossibile leggere le dimensioni dell'array dal file \n");
fclose(inFile);
}

//alloca la memoria necessaria
matrice = (float*)malloc(sizeof(*matrice)*width*height);
if(matrice==NULL) {
OpenSteer::OpenSteerDemo::errorExit("Impossibile leggere le dimension dell'array dal File\n");
fclose(inFile);
}

//leggi i valori della matrice considerandola come un vettore width height
for(i=0; i<width*height; i++)
{
if(fscanf(inFile,"%f",&matrice[i])!=1) {
OpenSteer::OpenSteerDemo::errorExit("Il File non contiene abbastanza dati.\n");
free(matrice);
fclose(inFile);
}
}
fclose(inFile);

Salve, questo codice mi era stato suggerito per effettuare le seguenti operazioni:
aprire un file, leggere i valori di riga e colonna presenti nelle prime 2 righe, allocare la memoria necessaria alla matrice non considerando le prime due righe.
Va benissimo però volevo sapere se fosse possibile creare una finestra per la selezione del file, invece di specificarlo nel codice.Sto usando Visual C++ 2008. Cosi facendo renderei piu usabile l'applicazione in modo tale da nn dover ogni volta modificare nel codice il nome del file che desidero aprire.
Grazie

MItaly
21-05-2010, 22:11
Puoi usare la API GetOpenFileName (http://msdn.microsoft.com/en-us/library/ms646927%28v=VS.85%29.aspx).

sandrinolli
22-05-2010, 17:50
Ciao ho dato uno sgardo al link che mi hai suggerito ed è davvero molto interessante.
Volevo chiederti una cosa. Se utilizzo GetOpenFileName come faccio poi a collegare questo file con inFile del codice?
Potresti darmi una mano?

Cioè io dovrei sostituire il codice relativo a fopen e metter GetOpenFileName ed il resto dovrebbe rimanere uguale. :-(
Grazie mille

MItaly
22-05-2010, 21:20
Cos'è che non sai fare?

sandrinolli
23-05-2010, 15:21
Ciao , ti spigo subito.
Io vorrei che si aprisse una finestra per la selezione del file e successivamente venissero fatti tutti i controlli e le istruzioni consigliate da te.
Ma non so bene come fare...Io ho messo queste istruzioni:




OPENFILENAME ofn;
GetOpenFileName(&ofn);

//leggi i valori di righe e colonne
if(fscanf(inFile,"%d %d",&height,&width)!=2)
{
OpenSteer::OpenSteerDemo::errorExit("Impossibile leggere le dimensioni dell'array dal File.\n");
fclose(inFile);
}
//alloca la memoria necessaria
matrice = (float*)malloc(sizeof(*matrice)*width*height);
if(matrice==NULL)
{
OpenSteer::OpenSteerDemo::errorExit("Impossibile leggere le dimensioni dell'array dal File.\n");
fclose(inFile);
}
//leggi i valori della matrice considerandola come un vettore width height
for(i=0; i<width*height; i++)
{
if(fscanf(inFile,"%f",&matrice[i])!=1)
{
OpenSteer::OpenSteerDemo::errorExit("Il File non contiene abbastanza dati.\n");
free(matrice);
fclose(inFile);
}
}
fclose(inFile);



Al posto di questa istruzione:

inFile = fopen("ciao.txt","r");
if(inFile==NULL)
{
OpenSteer::OpenSteerDemo::errorExit("Impossibile aprire il File del plugin successivo per il caricamento dei dati :\n");
}

Ho messo le prime due del codice ma non so se va bene, infatti facendo il debug mi da un errore su inFile che effettivamente non ha nessuna connessione con ofn. :-(

MItaly
23-05-2010, 15:54
Io ho capito ciò di cui hai bisogno, ma quello che hai scritto non ha nessun senso, e ti dico francamente che buttare lì cose a caso sperando che io corregga non è un metodo che funziona.

In primo luogo la struttura OPENFILENAME deve essere inizializzata con i parametri adeguati a quello che vuoi ottenere; quindi, il file va effettivamente aperto (sempre con fopen), visto che GetOpenFileName ti fornisce semplicemente il percorso del file che ha scelto l'utente: cosa farne è a discrezione del codice che la richiama.

Qui (http://msdn.microsoft.com/en-us/library/ms646829%28v=VS.85%29.aspx#open_file) c'è del codice di esempio (che, se avessi letto la documentazione a cui ti ho rimandato, avresti visto subito), ma copiarlo paro paro non ti servirà a niente, devi capire sempre cosa stai facendo (e per quello c'è la documentazione di riferimento che ti ho già linkato), altrimenti andrai avanti a programmare a colpi di copia-incolla e di domande sul forum, pratica che non porta assolutamente a niente.

sandrinolli
23-05-2010, 16:12
Non ho mai pensato di fare il copia e incolla e non ho nemmeno mai pensato di risolvere i miei problemi chiedendo aiuto su un forum....però se potessi avre una mano!!!
Io ho bisogno che si apra una finestra che mi permetta di selezionare un file. Uno volta selezionato il file, questo deve essere aperto, devono essere lette le prime due righe che indicano il numero di riga e colonna ecc. va bene per questo GetOpenFileName?

MItaly
23-05-2010, 16:34
Certo che va bene OpenFileName, ma capisci che l'impressione che si ha vedendo quello che hai scritto è di uno che neanche ha letto la documentazione, perché uno che l'avesse letta:

saprebbe che quella funzione fa esattamente quello che chiedi;
saprebbe che con quella funzione si ottiene semplicemente il nome del file selezionato, e non un FILE * da usare con le funzioni di IO del C;
saprebbe che tutti i membri della struttura vanno inizializzati in qualche maniera, visto che ovviamente passare una struttura non inizializzata (che è unico parametro della funzione) non è una grande idea;
avrebbe visto la pagina con l'esempio di utilizzo, da cui viene chiarito il resto della documentazione;
avrebbe provato l'esempio in questione, vedendo nel debugger cosa succede alla struttura prima e dopo la chiamata;
magari avrebbe provato ad inserirlo nel programma in questione, con le modifiche del caso;
eventualmente sarebbe tornato sul forum o a dire "tutto ok, problema risolto", o a chiedere delucidazioni su alcuni dettagli, riportando gli esperimenti che sta facendo, e magari intanto continuando a provare.

Vedi bene l'atteggiamento giusto qui (http://forum.html.it/forum/showthread.php?s=&threadid=1404798), su un problema assolutamente identico; kirakira93 si è prima di tutto documentato, trovando del codice un po' troppo complicato, gli ho suggerito la stessa funzione che ho suggerito a te; invece di continuare a chiedere "ma io voglio questa cosa qui" si è rimboccato le maniche, e nel giro di un'oretta ha risolto per i fatti suoi, ringraziandomi per l'input giusto che gli ho dato.
E non è che kirakira93 sia un super esperto di programmazione win32, anzi, ha iniziato da poco, ma ha l'atteggiamento giusto: chiede consigli sulle cose che non sa e poi approfondisce per i fatti suoi, gli è stato suggerito di comprarsi un libro su Win32 per imparare a lavorare su basi solide e l'ha fatto.

Quando si incontrano domande semplici, su questo forum, si cerca di evitare di fornire la soluzione già pronta, fornendo invece input utili a chi pone la domanda in maniera tale che possa apprendere come risolvere il problema specifico, ma anche come diventare più autonomo nella risoluzione dei problemi. Chiarifico: per scrivere il codice che ti serve ci metto due minuti, il punto è che io, come più o meno tutti quelli che abitualmente rispondono qui, ritengo che sia più utile per te imparare a diventare più autonoma, e per questo se noti ci ho perso del discreto tempo. Quindi: non ripetere per l'ennesima volta che vuoi che si apra una finestra in cui l'utente possa selezionare un file, tanto non intendo fornirti la risposta già pronta. Quindi rimboccati le maniche e mettiti al lavoro: la documentazione è lì, gli esempi pure, hai tutto il necessario per capire come fare.

sandrinolli
23-05-2010, 17:38
Ho provato!!! La finestra non si apre per la selezione del file e quindi ho subito degli errori sulle convalide. Ti posto il codice:


float * matrice;
FILE *inFile;
int i,j;
int width=0,height=0;

OPENFILENAME ofn;
char szFile[260];
HWND hwnd;
HANDLE hf;

ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.*\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

// Display the Open dialog box.
if (GetOpenFileName(&ofn)==TRUE)

/*hf = CreateFile(ofn.lpstrFile,GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);*/

inFile = fopen(ofn.lpstrFile,"r");
if(inFile==NULL)
{
OpenSteer::OpenSteerDemo::errorExit("Impossibile aprire il File del plugin successivo per il caricamento dei dati :\n");
}

if(fscanf(inFile,"%d %d",&height,&width)!=2)
{
OpenSteer::OpenSteerDemo::errorExit("Impossibile leggere le dimensioni dell'array dal File.\n");
fclose(inFile);
}

//alloca la memoria necessaria
matrice = (float*)malloc(sizeof(*matrice)*width*height);
if(matrice==NULL)
{
OpenSteer::OpenSteerDemo::errorExit("Impossibile leggere le dimensioni dell'array dal File.\n");
fclose(inFile);
}

//leggi i valori della matrice considerandola come un vettore width height
for(i=0; i<width*height; i++)
{
if(fscanf(inFile,"%f",&matrice[i])!=1)
{
OpenSteer::OpenSteerDemo::errorExit("Il File non contiene abbastanza dati.\n");
free(matrice);
fclose(inFile);
}
}
fclose(inFile);




La finestra per la selezione del file non viene aperta e quindi anche inFile risulta essere nullo penso.

MItaly
23-05-2010, 19:11
Ovviamente devi inizializzare hwndOwner con l'handle della finestra proprietaria della finestra che verrà creata. Se la tua applicazione non è un'applicazione GUI, basta impostare hwndOwner a NULL.

In ogni caso, le variabili hwnd e hf sono inutili, rimuovile.

Loading