View Full Version : PICCOLO PROBLEMA IN C++
TnxElektro
27-02-2013, 17:22
Sto costruendo un programma in c++ e quando tento di creare un file txt nel desktop ricavando prima il nome utente ricevo un errore da parte del compilatore. Vi posto il pezzo di codice indicandovi dove lo riscontro(inizialmente ho incluso la libreria "iostream", "fstream", "conio.h", "windows.h" e "Lmcons.h"):
TCHAR name[UNLEN + 1];
DWORD size = UNLEN + 1;
if (GetUserName( (TCHAR*)name, &size )){
cout<<utente<<endl;
_getch();
ofstream scrivi("C:\\Users\\" + name + "\\Desktop\\risultati.txt"); */ QUI SI VERIFICA L'ERRORE, NEL "+ name + " /*
scrivi<<d<<".\n";
scrivi.close();
cout<<"File salvato correttamente!"<<endl;
_getch();
}
sottovento
27-02-2013, 17:28
ofstream scrivi("C:\\Users\\" + name + "\\Desktop\\risultati.txt"); */ QUI SI VERIFICA L'ERRORE, NEL "+ name + " /*
Non puoi sommare le stringhe, intese come char*!!!
TnxElektro
27-02-2013, 17:45
Come devo fare allora? Mi puoi postare il codice esatto? Devo usare a posto del "+" l'operatore "&&"?
sottovento
27-02-2013, 18:06
Hai diverse soluzioni. Per esempio, potresti passare attraverso delle std::string
/* La tiro per le lunghe, sperando che si capisca meglio */
std::string filename("C:\\Users\\");
filename += name;
filename += "\\Desktop\\risultati.txt";
ofstream scrivi(filename.c_str());
Oppure puoi passare attraverso le primitive C:
char str[255];
sprintf (str, "C:\\Users\\%s\\Desktop\\risultati.txt", name);
ofstream scrivi(str);
Questa pero' ha lo svantaggio che devi essere sicuro che str sia lunga abbastanza da contenere la stringa finale. In caso contrario, e' un casino (letteralmente! In teoria potresti non ottenere alcuna segnalazione di errore e poi andare in crash dopo un po', che poi e' la situazione peggiore).
Per ovviare a questa sgradevole situazione, puoi usare la
int snprintf ( char * s, size_t n, const char * format, ... );
invece della sprintf:
char str[255];
snprintf (str, sizeof(str), "C:\\Users\\%s\\Desktop\\risultati.txt", name);
ofstream scrivi(str);
oppure, con i compilatori microsoft, puoi usare la sprintf_s() (stessa sintassi di snprintf().
TnxElektro
27-02-2013, 19:05
Molte grazie!! Ora il programma funziona! Ecco il codice che sto usando, anche se non comprende quello di tutto il software("scrivi" l'ho già dichiarato prima! E avevo precedentemente incluso la libreria "string"):
TCHAR name[UNLEN + 1];
DWORD size = UNLEN + 1;
if (GetUserName( (TCHAR*)name, &size )){
string dest="C:\\Users\\";
dest+=name;
dest+="\\Desktop\\risultati.txt";
scrivi.open(dest.c_str());
scrivi<<d<<".\n";
scrivi.close();
cout<<"File salvato correttamente!"<<endl;
_getch();
}
}
sottovento
27-02-2013, 19:15
Molte grazie!! Ora il programma funziona! Ecco il codice che sto usando, anche se non comprende quello di tutto il software("scrivi" l'ho già dichiarato prima! E avevo precedentemente incluso la libreria "string"):
TCHAR name[UNLEN + 1];
DWORD size = UNLEN + 1;
if (GetUserName( (TCHAR*)name, &size )){
string dest="C:\\Users\\";
dest+=name;
dest+="\\Desktop\\risultati.txt";
scrivi.open(dest.c_str());
scrivi<<d<<".\n";
scrivi.close();
cout<<"File salvato correttamente!"<<endl;
_getch();
}
}
Bene. Ho solo un dubbio: stai usando TCHAR perche' vuoi generare le versioni ASCII e UNICODE del tuo software? In tal caso devi aggiungere qualcosina in piu', per manipolare correttamente le stringhe.
Se questo non e' il tuo caso, allora va tutto bene ;)
TnxElektro
27-02-2013, 20:20
No, non è il mio caso. :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.