View Full Version : [C++]Stringa Composta? Stringa -> riga in file?
demonbl@ck
01-08-2008, 03:41
Ciao a tutti, innanzitutto programmo in C++ da 1 giorno dopo che ho da sempre programmato in pascal (:stordita:, velocità di esecuzione pari a 0...), quindi non ammazzatemi subito :asd:
Allora, praticamente il mio problema è quello di creare una stringa composta da usare poi come nome per un file.
Mi spiego meglio:
string dst,name; int i;
cout << "Quanti file devo creare?" << endl;
cin >> N;
cout << "Inserisci il percorso in cui salvarli" << endl;
cin >> dst;
for (i=0; i<=N; i++)
{
--altre istruzioni del for--
name = dst + i + "." + rand()%10 + rand()%10 + rand()%10;
--altre istruzioni del for--
}
Quell'assegnamento mi risulta in una grossa nuvola di vapore, mentre in Pascal potevo tranquillamente farlo e la stringa creata era ad esempio
c:\test\255.671
Qualcuno potrebbe aiutarmi? :mc:
Inoltre, come faccio a scrivere una riga in un file ?
il file lo apro con
FILE *stream = fopen("c:\\programdata.txt","w");
e posso aggiungere righe con
fprintf(stream,"%d",variabileinteraacaso);
o con gli altri identificatori della printf.
Il problema arriva quando tento di fare questo:
frpintf(stream,"%s",variabilestringaacaso);
che mi restituisce un bel
30 D:\Documents and Settings\Nik\Documenti\C++\TUHDSS.cpp [Warning] cannot pass objects of non-POD type `struct std::string' through `...'; call will abort at runtime
:help:
[...] Mi spiego meglio:
string dst,name; int i;
cout << "Quanti file devo creare?" << endl;
cin >> N;
cout << "Inserisci il percorso in cui salvarli" << endl;
cin >> dst;
for (i=0; i<=N; i++)
{
--altre istruzioni del for--
name = dst + i + "." + rand()%10 + rand()%10 + rand()%10;
--altre istruzioni del for--
}
Quell'assegnamento mi risulta in una grossa nuvola di vapore, mentre in Pascal potevo tranquillamente farlo e la stringa creata era ad esempio
c:\test\255.671
devi usare uno stringstream; prova così:
for (int i = 0; i < N; i++)
{
string dst = "C:\\test\\";
ostringstream oss;
oss << dst << i << "." << (rand() % 10 + rand() % 10 + rand() % 10);
string name = oss.str();
}
Inoltre, come faccio a scrivere una riga in un file ? classe ofstream (sta per "Output File Stream"); qui il reference: http://www.cplusplus.com/reference/iostream/ofstream/
il file lo apro con
FILE *stream = fopen("c:\\programdata.txt","w");
e posso aggiungere righe con
fprintf(stream,"%d",variabileinteraacaso);
o con gli altri identificatori della printf. ARGH, non usare la libreria di I/O del C in C++ :muro:
Il problema arriva quando tento di fare questo:
frpintf(stream,"%s",variabilestringaacaso);
che mi restituisce un bel
30 D:\Documents and Settings\Nik\Documenti\C++\TUHDSS.cpp [Warning] cannot pass objects of non-POD type `struct std::string' through `...'; call will abort at runtime
il warning ti dice che secondo il format string quel parametro doveva essere un puntatore a char, non un oggetto std::string; e ovviamente ha ragione. per ottenere il puntatore al buffer di caratteri contenuto in una std::string devi usare il metodo c_str:
http://www.cplusplus.com/reference/string/string/c_str.html
ma come ti ho già spiegato, in C++ usa la libreria di I/O delle STL, che è anche più facile da usare (non ci sono format string).
demonbl@ck
02-08-2008, 01:36
devi usare uno stringstream; prova così:
for (int i = 0; i < N; i++)
{
string dst = "C:\\test\\";
ostringstream oss;
oss << dst << i << "." << (rand() % 10 + rand() % 10 + rand() % 10);
string name = oss.str();
}
Mi dice
26 D:\Documents and Settings\Nik\Documenti\C++\TUHDSS.cpp aggregate `std::stringstream oss' has incomplete type and cannot be defined
:cry:
classe ofstream (sta per "Output File Stream"); qui il reference: http://www.cplusplus.com/reference/iostream/ofstream/
ARGH, non usare la libreria di I/O del C in C++ :muro:
il warning ti dice che secondo il format string quel parametro doveva essere un puntatore a char, non un oggetto std::string; e ovviamente ha ragione. per ottenere il puntatore al buffer di caratteri contenuto in una std::string devi usare il metodo c_str:
http://www.cplusplus.com/reference/string/string/c_str.html
ma come ti ho già spiegato, in C++ usa la libreria di I/O delle STL, che è anche più facile da usare (non ci sono format string).
Perfetto. ora riesco sia a leggere che a scrivere un file. Grazie :)
Ho solo un problema: non riesco ad andare a capo. :stordita:
se io metto
outfile << "stringaperprovare" << endl << DST;
al posto di andare a capo mi scrive
stringaperprovare[caratterestrano]c:\uindov\sistemtrentadue\
lo stesso se provo con
outfile << "stringaperprovare \n" << DST;
Ovviamente c:\uindov\sistemtrentadue\ è un valore a caso che ho dato io a DST :asd:
ancora questo piccolo helpettino e ce la posso fare :cool:
EDIT:
altro problemino,
ofstream outfile (dst,ofstream::binary);
in cui dst è una stringa contenente il nome del file mi restituisce
24 D:\Documents and Settings\Nik\Documenti\C++\TUHDFS.cpp no matching function for call to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::string&, const std::_Ios_Openmode&)'
:|
Mi dice
26 D:\Documents and Settings\Nik\Documenti\C++\TUHDSS.cpp aggregate `std::stringstream oss' has incomplete type and cannot be defined
:cry: hai incluso <sstream> ?
Perfetto. ora riesco sia a leggere che a scrivere un file. Grazie :)
Ho solo un problema: non riesco ad andare a capo. :stordita: [...] l'uso di endl al posto di "\n" in teoria serve proprio ad eliminare il problema; non specificare alcuna modalità di apertura al costruttore di ofstream, lascia quelle di default:
ofstream outfile("nome e percorso");
Ovviamente c:\uindov\sistemtrentadue\ è un valore a caso che ho dato io a DST :asd: bellissimo :asd:
altro problemino,
ofstream outfile (dst,ofstream::binary);
in cui dst è una stringa contenente il nome del file mi restituisce
24 D:\Documents and Settings\Nik\Documenti\C++\TUHDFS.cpp no matching function for call to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::string&, const std::_Ios_Openmode&)'
:| uhm, hai incluso <fstream> ?
demonbl@ck
02-08-2008, 08:26
hai incluso <sstream> ?
l'uso di endl al posto di "\n" in teoria serve proprio ad eliminare il problema; non specificare alcuna modalità di apertura al costruttore di ofstream, lascia quelle di default:
ofstream outfile("nome e percorso");
bellissimo :asd:
uhm, hai incluso <fstream> ?
Ottimo, adesso va a capo (non so per quale oscuro motivo avevo aperto il file in modalità binary :fagiano: ).
Però restano due problemi:
1)Se provo ad usare OSS per aprire un file mi butta fuori
46 D:\Documents and Settings\Nik\Documenti\C++\TUHDFS.cpp invalid conversion from `void*' to `const char*'
46 D:\Documents and Settings\Nik\Documenti\C++\TUHDFS.cpp initializing argument 1 of `std::basic_ofstream<_CharT, _Traits>::basic_ofstream(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]'
2) se provo a usare OSS all'esterno del for mi dice undeclared( :confused: :confused: :confused: )
3)se invece di OSS per aprire il file provo con DST (dandogli un valore opportuno) ottengo sempre
23 D:\Documents and Settings\Nik\Documenti\C++\TUHDFS.cpp no matching function for call to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::string&)'
E SI, ho abilitato sia sstream (adesso va OSS e prima no) che fstream (già da prima) :)
1)Se provo ad usare OSS per aprire un file mi butta fuori [...] l'ostringstream non va usato per aprire files, serve solo a costruire stringhe infilandoci pezzi di ogni tipo con l'operatore <<. è un mezzo di I/O mappato su una stringa anziché su un file.
2) se provo a usare OSS all'esterno del for mi dice undeclared( :confused: :confused: :confused: ) se l'hai dichiarato all'interno mi pare il minimo... sai cos'è uno scope? te la faccio breve, la dichiarazione di una variabile ha valore solo all'interno del blocco in cui la dichiari; appena sei fuori dalla parentesi graffa chiusa quella variabile non esiste più.
3)se invece di OSS per aprire il file provo con DST (dandogli un valore opportuno) ottengo sempre [...] non ho capito :wtf:
dst non era una stringa? il file aprilo semplicemente con l'ofstream:
ofstream outfile("C:\\pippo.txt");
demonbl@ck
04-08-2008, 12:59
se l'hai dichiarato all'interno mi pare il minimo... sai cos'è uno scope? te la faccio breve, la dichiarazione di una variabile ha valore solo all'interno del blocco in cui la dichiari; appena sei fuori dalla parentesi graffa chiusa quella variabile non esiste più.
Ok, credevo che questo valesse solo per le funzioni. :fagiano:
non ho capito :wtf:
dst non era una stringa? il file aprilo semplicemente con l'ofstream:
ofstream outfile("C:\\pippo.txt");
Certo che è una stringa, ed è proprio per usarla come nome di file che mi serve... :mc:
Quindi o apro il file direttamente con OSS oppure devo assegnare a DST2 il valore di OSS e poi aprirlo con DST2. :fagiano: (No, non posso usare un nome predefinito per il file, perchè è una serie di file che devo aprire... è per questo che devo creare la stringa composta tra l'altro:
OSS << DST << I << "." << rand()%10;<< rand()%10;<< rand()%10;
I è la variabile di controllo del for e mi serve appunto per dare una sequenzialità ai nomi. ;)
demonbl@ck
09-08-2008, 09:32
Up? :stordita:
:mc:
allora...
for (int i = 0; i < N; i++)
{
string dst = "C:\\test\\";
ostringstream oss;
oss << dst << i << "." << (rand() % 10 + rand() % 10 + rand() % 10);
string name = oss.str();
ofstream outfile(name);
if (outfile.good())
{
// scrivi sul file
// ...
}
}
demonbl@ck
09-08-2008, 22:34
:mc:
allora...
for (int i = 0; i < N; i++)
{
string dst = "C:\\test\\";
ostringstream oss;
oss << dst << i << "." << (rand() % 10 + rand() % 10 + rand() % 10);
string name = oss.str();
ofstream outfile(name);
if (outfile.good())
{
// scrivi sul file
// ...
}
}
Mi da sempre l'errore
43 D:\Documents and Settings\Nik\Documenti\C++\TUHDSS.cpp no matching function for call to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::string&)'
, esattamente come quando avevo provato io... :mc:
ops, verissimo errore mio:
for (int i = 0; i < N; i++)
{
string dst = "C:\\test\\";
ostringstream oss;
oss << dst << i << "." << (rand() % 10 + rand() % 10 + rand() % 10);
string name = oss.str();
ofstream outfile(name.c_str());
if (outfile.good())
{
// scrivi sul file
// ...
}
}
demonbl@ck
14-08-2008, 23:15
ops, verissimo errore mio:
for (int i = 0; i < N; i++)
{
string dst = "C:\\test\\";
ostringstream oss;
oss << dst << i << "." << (rand() % 10 + rand() % 10 + rand() % 10);
string name = oss.str();
ofstream outfile(name.c_str());
if (outfile.good())
{
// scrivi sul file
// ...
}
}
Scusa, non ho potuto rispondere prima.
Comunque funziona perfettamente, grazie :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.