Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Mic Mini 2: audio 48 kHz / 24-bit e protocollo OsmoAudio sotto i 100 Euro
DJI Mic Mini 2: audio 48 kHz / 24-bit e protocollo OsmoAudio sotto i 100 Euro
DJI presenta Mic Mini 2, un sistema microfonico wireless ultra-compatto progettato per democratizzare l'audio di alta qualità nella fascia entry-level. Con un peso di soli 11 grammi per il trasmettitore elimina i fastidi tipici dei modelli più pesanti sui vestiti. Nonostante la miniaturizzazione Mic Mini 2 offre prestazioni tecniche di rilievo: registrazione omnidirezionale a 48 kHz/24-bit, tre preset vocali (Regular, Bright, Rich) e un sistema di cancellazione attiva del rumore a due livelli.
Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico
Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico
Motorola propone in fascia media il nuovo Moto G77 5G, uno smartphone che punta sul display AMOLED da 1.5K a 120Hz, e sulla fotocamera da 108 MP con stabilizzazione ottica per affrontare la fascia media. Il tutto insieme a una batteria da 5200mAh in soli 7,3 millimetri di spessore, con una scocca certificata con standard militari
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI ha appena ufficializzato la serie Lito, la sua nuova gamma di droni entry-level destinata a chi si avvicina per la prima volta alla fotografia aerea. Al centro dell'annuncio ci sono due modelli ben distinti per fascia di prezzo e specifiche tecniche: DJI Lito 1 e DJI Lito X1. Entrambi si collocano sotto la soglia regolamentare dei 249 grammi, che permette di volare con requisiti burocratici più semplici rispetto ai droni più pesanti.
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


DJI Mic Mini 2: audio 48 kHz / 24-bit e protocollo OsmoAudio sotto i 100 Euro DJI Mic Mini 2: audio 48 kHz / 24-bit e protocol...
Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico Recensione Moto G77: display AMOLED e buona auto...
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla DJI Lito 1 e Lito X1 recensione: i nuovi droni p...
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi Sony World Photography Awards 2026: i premiati, ...
Una settimana con Hyundai Ioniq 5 N-Line: diverte e convince Una settimana con Hyundai Ioniq 5 N-Line: divert...
Nuovi MacBook Pro 14,2" con chip M5...
Configuratore Corsair FRAME, il punto di...
I giochi digitali su PS4 e PS5 hanno un ...
Robot umanoidi negli aeroporti: a Tokyo ...
I nuovi processori Intel Wildcat Lake so...
La dashcam 70mai A800SE a 109€ registra ...
The Blood of Dawnwalker: il sistema dei ...
Numeri a tre cifre contro le truffe tele...
Fine di un'era nel gaming PC: Denuvo &eg...
Hisense Smart TV serie U72Q in super sco...
OnePlus punta sul gaming: ecco il nuovo ...
Scope elettriche Tineco e Dreame: lavano...
Resident Evil Requiem: ecco cosa preferi...
iPhone Ultra: il primo pieghevole di App...
Hisense taglia i prezzi anche dei QLED: ...
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:42.


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