Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-08-2008, 04: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, 23: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, 02: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 03:16.
demonbl@ck è offline   Rispondi citando il messaggio o parte di esso
Old 02-08-2008, 08: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, 09: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, 14: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, 13: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, 10: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, 11: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, 23: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 10-08-2008, 00: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 15-08-2008, 00: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


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Nuove scorte ma solo 8 unità: ogg...
Fascia media mica tanto: XIAOMI Redmi No...
iPad Pro 13'' con chip M4 e 512GB costa ...
La BMW M3 elettrica emetterà i so...
Nuova Opel Astra Electric, primo contatt...
Tornano in sconto 2 caricatori multipli ...
La Ferrari SF-26 di F1 verrà pres...
HONOR Magic V6 sarà il pieghevole...
Signorini denuncia Google e diffida YouT...
OnePlus 15T non ha (quasi) più se...
Roborock Qrevo Curv 2 Pro a un super pre...
Da Sony la serie Crystal LED S, display ...
Gemini non segue ChatGPT: la pubblicit&a...
Google Chrome per iOS avrà un'opz...
Blocco note e Paint si aggiornano con nu...
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: 10:00.


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