Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-08-2008, 03:41   #1
demonbl@ck
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 1056
[C++]Stringa Composta? Stringa -> riga in file?

Ciao a tutti, innanzitutto programmo in C++ da 1 giorno dopo che ho da sempre programmato in pascal (, velocità di esecuzione pari a 0...), quindi non ammazzatemi subito


Allora, praticamente il mio problema è quello di creare una stringa composta da usare poi come nome per un file.

Mi spiego meglio:


Codice:
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?

Inoltre, come faccio a scrivere una riga in un file ?

il file lo apro con

Codice:
FILE *stream = fopen("c:\\programdata.txt","w");
e posso aggiungere righe con

Codice:
fprintf(stream,"%d",variabileinteraacaso);
o con gli altri identificatori della printf.

Il problema arriva quando tento di fare questo:

Codice:
frpintf(stream,"%s",variabilestringaacaso);
che mi restituisce un bel

Codice:
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

demonbl@ck è offline   Rispondi citando il messaggio o parte di esso
Old 01-08-2008, 22:08   #2
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da demonbl@ck Guarda i messaggi
[...] Mi spiego meglio:

Codice:
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ì:
Codice:
	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();
	}


Quote:
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/


Quote:
il file lo apro con

Codice:
FILE *stream = fopen("c:\\programdata.txt","w");
e posso aggiungere righe con

Codice:
fprintf(stream,"%d",variabileinteraacaso);
o con gli altri identificatori della printf.
ARGH, non usare la libreria di I/O del C in C++


Quote:
Il problema arriva quando tento di fare questo:

Codice:
frpintf(stream,"%s",variabilestringaacaso);
che mi restituisce un bel

Codice:
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/s...ing/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).
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 02-08-2008, 01:36   #3
demonbl@ck
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 1056
Quote:
Originariamente inviato da 71104 Guarda i messaggi
devi usare uno stringstream; prova così:
Codice:
	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

Codice:
26 D:\Documents and Settings\Nik\Documenti\C++\TUHDSS.cpp aggregate `std::stringstream oss' has incomplete type and cannot be defined

Quote:
Originariamente inviato da 71104 Guarda i messaggi
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++


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/s...ing/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.

se io metto

Codice:
outfile << "stringaperprovare" << endl << DST;
al posto di andare a capo mi scrive

Codice:
stringaperprovare[caratterestrano]c:\uindov\sistemtrentadue\
lo stesso se provo con

Codice:
outfile << "stringaperprovare \n" << DST;
Ovviamente c:\uindov\sistemtrentadue\ è un valore a caso che ho dato io a DST

ancora questo piccolo helpettino e ce la posso fare


EDIT:

altro problemino,
Codice:
  ofstream outfile (dst,ofstream::binary);
in cui dst è una stringa contenente il nome del file mi restituisce

Codice:
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&)'
:|

Ultima modifica di demonbl@ck : 02-08-2008 alle 02:16.
demonbl@ck è offline   Rispondi citando il messaggio o parte di esso
Old 02-08-2008, 07:39   #4
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da demonbl@ck Guarda i messaggi
Mi dice

Codice:
26 D:\Documents and Settings\Nik\Documenti\C++\TUHDSS.cpp aggregate `std::stringstream oss' has incomplete type and cannot be defined
hai incluso <sstream> ?


Quote:
Perfetto. ora riesco sia a leggere che a scrivere un file. Grazie
Ho solo un problema: non riesco ad andare a capo. [...]
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:
Codice:
ofstream outfile("nome e percorso");

Quote:
Ovviamente c:\uindov\sistemtrentadue\ è un valore a caso che ho dato io a DST
bellissimo


Quote:
altro problemino,
Codice:
  ofstream outfile (dst,ofstream::binary);
in cui dst è una stringa contenente il nome del file mi restituisce

Codice:
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> ?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 02-08-2008, 08:26   #5
demonbl@ck
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 1056
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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:
Codice:
ofstream outfile("nome e percorso");

bellissimo


uhm, hai incluso <fstream> ?
Ottimo, adesso va a capo (non so per quale oscuro motivo avevo aperto il file in modalità binary ).

Però restano due problemi:

1)Se provo ad usare OSS per aprire un file mi butta fuori

Codice:
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( )

3)se invece di OSS per aprire il file provo con DST (dandogli un valore opportuno) ottengo sempre

Codice:
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)
demonbl@ck è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2008, 13:24   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da demonbl@ck Guarda i messaggi
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.


Quote:
2) se provo a usare OSS all'esterno del for mi dice undeclared( )
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ù.


Quote:
3)se invece di OSS per aprire il file provo con DST (dandogli un valore opportuno) ottengo sempre [...]
non ho capito
dst non era una stringa? il file aprilo semplicemente con l'ofstream:
Codice:
ofstream outfile("C:\\pippo.txt");
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 04-08-2008, 12:59   #7
demonbl@ck
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 1056
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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.
Quote:
Originariamente inviato da 71104 Guarda i messaggi
non ho capito
dst non era una stringa? il file aprilo semplicemente con l'ofstream:
Codice:
ofstream outfile("C:\\pippo.txt");
Certo che è una stringa, ed è proprio per usarla come nome di file che mi serve...

Quindi o apro il file direttamente con OSS oppure devo assegnare a DST2 il valore di OSS e poi aprirlo con DST2. (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 è offline   Rispondi citando il messaggio o parte di esso
Old 09-08-2008, 09:32   #8
demonbl@ck
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 1056
Up?
demonbl@ck è offline   Rispondi citando il messaggio o parte di esso
Old 09-08-2008, 10:17   #9
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029


allora...

Codice:
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
		// ...
	}
}
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 09-08-2008, 22:34   #10
demonbl@ck
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 1056
Quote:
Originariamente inviato da 71104 Guarda i messaggi


allora...

Codice:
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

Codice:
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...
demonbl@ck è offline   Rispondi citando il messaggio o parte di esso
Old 09-08-2008, 23:41   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ops, verissimo errore mio:
Codice:
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
		// ...
	}
}
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 14-08-2008, 23:15   #12
demonbl@ck
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 1056
Quote:
Originariamente inviato da 71104 Guarda i messaggi
ops, verissimo errore mio:
Codice:
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
demonbl@ck è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
EUREKA J15 Ultra ed Evo Ultra in offerta...
L'Olanda 'nazionalizza' il produttore di...
Robot Lefant M2 Pro in offerta su Amazon...
Ultimi 2 giorni di sconti sui dispositiv...
TP-Link è già proiettata a...
Colpo grosso di Zuckerberg: Meta assume ...
Addio ai matrimoni con l'intelligenza ar...
Le sonde spaziali ESA ExoMars e Mars Exp...
Roscosmos: static fire per i propulsori ...
Alcune partite NBA saranno trasmesse in ...
Intel Core 13000 e 14000 aumentano uffic...
Gemini sta per arrivare in Google Maps: ...
2 minuti per vedere le 27 offerte imperd...
Ray-Ban Meta Display: tecnologia sorpren...
Un mini PC a prezzo stracciato, non cerc...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:26.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v