Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
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


Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
The Twisted Tale of Amanda Knox: il prim...
Samsung rallenta: utili in caduta libera...
'Il realismo ha rovinato i videogiochi' ...
Crollano anche i TV QLED Hisense: c'&egr...
Photoshop 2025: le nuove funzioni AI che...
Qualcomm cresce, ma la CPU per datacente...
Gli iPhone in offerta oggi? C'è i...
L'evoluzione di Revolut: arrivano anche ...
Microsoft entra nel club dei 4.000 milia...
Ufficiale, Google firmerà il Codi...
Mettereste una NPU dedicata all'intellig...
I nuovi iPhone 17 costeranno di pi&ugrav...
Zuckerberg: 'Chi non indosserà sm...
La scopa elettrica bestseller super acce...
Amazon, svendite pesanti di 11 TV OLED: ...
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: 09:34.


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