PDA

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:

71104
01-08-2008, 22:08
[...] 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&)'



:|

71104
02-08-2008, 07:39
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) :)

71104
03-08-2008, 13:24
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:

71104
09-08-2008, 10:17
: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:

71104
09-08-2008, 23:41
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