PDA

View Full Version : [c++][Win32] Open/Save File Common Dialog e passaggio stringhe a funzioni


willygroup
14-11-2008, 10:43
Ciao,
ho un problema che probabilmente ai più sembrerà banale, ma è qualche ora che ci sbatto la testa e non riesco a risolverlo.


// Programma principale

char * pippo = DoFileOpen();

// Qui visualizzo la stringa con un messageBox ed effettivamente
// la restituisce correttamente

ApriFile(pippo);



//DoFileOpen

char * DoFileOpen(){

OPENFILENAMEA ofn;
.
.
.
return ofn.lpstrFile;
}



//ApriFile
ApriFile(char * nomeFile){

(2)
// A questo punto se visualizzo nomeFile questo è composto da caratteri strani.

fopen_s(nomeFile, etc, etc)-> Da' errore

}

Se nel punto (1) inserisco questo codice:
char str[400];
sprintf_s(str,400,pippo);
in str il nome del file è troncato.

Se con questo metodo se salvo in una directory "corta" funziona!

Come risolvo?
Inoltre mi consigliate qualche articolo/capitolo di libro che mi faccia capire bene l'uso dei puntatori?

cionci
14-11-2008, 12:23
Se ritorni ofn.lpstrFile, la memoria allocata da per ofn viene liberata alla fine della funzione, è quindi possibile che venga sovrascritta.

Per ovviare il problema:

- allochi un buffer che passi per riferimento a DoOpenFile e lo riempi con strcpy
- allochi il buffer dentro DoOpenFile e lo riempi con strcpy (soluzione secondo me molto brutta)
- usi una string e quindi ritorni string(ofn.lpstrFile) per copia
- usi una string passata per riferimento

fero86
14-11-2008, 15:53
se stai usando MFC più che una string dovresti usare una CStringT.
inoltre togliti dalla testa funzioni come fopen e sprintf, o le loro corrispondenti sicure di Visual C++: quelle fanno parte del C, non del C++, e sono supportate dal C++ solo per compatibilità coi sorgenti C.
stesso dicasi per strcpy e compagne.

willygroup
14-11-2008, 16:18
@ cionci
Grazie!
Ho risolto con le string.

@ fero86
Uso le Api di windows.


inoltre togliti dalla testa funzioni come fopen e sprintf,
o le loro corrispondenti sicure di Visual C++:

Quindi anche fopen_s e sprintf_s?
Cosa dovrei usare al posto di queste funzioni?

Grazie,
Willy

cionci
14-11-2008, 16:22
Dovresti usare ad esempio CreateFile per aprire i file, ma visto che anche quelle funzioni sono wrapping delle api alla fine puoi tranquillamente continuare ad usarle.
Certo con le stringhe bisogna stare attenti ;)

fero86
14-11-2008, 16:33
Quindi anche fopen_s e sprintf_s?
Cosa dovrei usare al posto di queste funzioni? il C++ introduce un'interfaccia di I/O completamente nuova e molto più facile da usare. al posto di fopen e fopen_s devi costruire un oggetto ifstream oppure ofstream, mentre al posto di sprintf e sprintf_s devi semplicemente usare l'operatore + di concatenazione definito da string.
in questi due siti c'è una buona documentazione delle librerie standard del C++:
http://www.cplusplus.com/reference/
http://www.cppreference.com/

dei due io preferisco il primo.

in particolare qui trovi la documentazione dell'interfaccia di I/O, di cui devi vedere le classi ifstream e ofstream:
http://www.cplusplus.com/reference/iostream/

mentre qui trovi la documentazione della classe string:
http://www.cplusplus.com/reference/string/

fero86
14-11-2008, 16:36
Dovresti usare ad esempio CreateFile per aprire i file, ma visto che anche quelle funzioni sono wrapping delle api alla fine puoi tranquillamente continuare ad usarle. CreateFile gli offre un controllo di cui lui non ha bisogno (visto che usava fopen...); quello di cui ha bisogno è programmare in C++ anziché in C :)
ifstream e ofstream sono più facili da usare, ad esempio non è necessario scrivere dei format string per generare dei files di testo.

cionci
14-11-2008, 16:37
Ah ok...ti riferivi a quello, allora sono d'accordo ;)