Newsgroup: it.comp.lang.c++
Titolo: Newbie & programmi 2° parte.

 soltanto essendo significativa).
Non è il mio caso.
Ogni suggerimento è ampiamente gradito.
Grazie per l'interesse.
Lele

 Lele
Ciao Lele,
ho scritto un piccolo esempio che può darti uno spunto.
E'scritto utilizzando le classi della libreria standard
del C++ : string e vector.
Puoi copiare l'esempio in un file .cpp e compilarlo.
Quindi puoi provare ad inserire qualche breakpoint e
seguire l'esecuzione del codice.
Utilizzo la funzione string::find_first_of per trovare i
separatori nel nome del file della canzone, la funzione
string::substr per estrarre i campi delimitati dai separatori.
Utilizzo un vector<string> per restituire i campi, presenti
nel nome del file, dalla funzione "separa", in modo flessibile.
Prova a modificare la stringa "dati" per vedere se
il programma funziona bene.
Prova con una stringa vuota e con una stringa
che non contiene separatori.
Ciao, Ugo
// LeleCanzone.cpp - START
#include <string>
#include <vector>
#include <iostream>
// Dichiarazioni using
// solo per ciò che serve
using std::string;
using std::vector;
using std::cout;
using std::cin;
// Dichiarazione per la funzione separa.
// La funzione separa una stringa di input
// utilizzando come separatori i caratteri forniti
// con il parametro sep.
// Ritorna un vettore di stringhe che rappresentano i
// campi contenuti nella stringa di input.
vector<string> separa(string input, string sep);
int main()
{
	string separatori( "_-." );
	string dati( "Titolo_-Canzone-Versione.mp3" );
	vector<string> campi = separa( dati, separatori );
	const size_t nCampi( campi.size() );
	cout << "La stringa contiene: " << nCampi << " campi.\n";
	for(size_t campo(0); campo < nCampi; ++campo){
		cout << "Il campo " << campo;
		cout << " contiene: " << campi[campo] << "\n";
	}
	cout << "\n";
	return 0;
}
// Definizione della funzione separa.
vector<string> separa(string input, string sep){
	size_t start( 0 );
	const size_t notFound( string::npos );
	vector<string> results;
	string campo;
	size_t found = input.find_first_of( sep );
	size_t nChars( 0 );
	while( found != notFound ){
		nChars = found - start;
		if( nChars != 0 ){
			campo = input.substr( start, nChars );
			results.push_back( campo );
		}
		start = found + 1;
		found = input.find_first_of( sep, start );
	}
	size_t finalCheck = input.size() - start;
	if( finalCheck > 1){
		campo = input.substr( start );
		results.push_back( campo );
	}
	return results;
}
// LeleCanzone.cpp - END


Nel programmino c'è un errore.
Prova a vedere se riesci a trovarlo.
Ugo

Ciao Ugo Mendes Donelli,
grazie per il tuo interesse, dammi qualche giorno perché devo studiare 
come funziona il vector. Avevo letto qualcosa ma non li ho mai utilizzati.
Ciao Lele

Ciao Ugo Mendes Donelli,
grazie mille per il tuo interesse, ho studiato e capito il tuo piccolo 
programma che hai fatto.
Dato che in string canzone "Artista_-C.A.N.Z.O.N.E.-versione.mp3" ci 
potrebbero essere dei titoli che al loro interno contengono dei punti 
seguiti da lettere (C.A.N.Z.O.N.E) quindi ho eliminato la ricerca del 
punti (".") ovvero:
string separatori = "_-."; lo modificato in
string separatori = "_-";
ma ho notato che non riesce a "vedere" il secondo trattino ("-") quindi 
non riportando l'ultima parte ("-versione").
Ho provato a fare diverse modifiche ma non ho risolto nulla.
Ciao
Lele


Posta del codice di esempio. Faccio fatica a capire il problema.
Hai trovato l'errore nella funzione separa? Prova a separare "Titolo_-
Canzone-Versione.m".
Puoi usare la funzione separa più volte. Puoi fare in modo di separare
la stringa in campi e poi separare il campo che ti interessa
utilizzando un'altra serie di separatori.
Ciao, Ugo

Ciao Ugo Mendes Donelli,
per il momento tralasciamo il fatto che non veda (giustamente) la parte 
del titolo ".mp3"
Quello che mi interessa è capire perché non riporta "-Versione".
Grazie Lele
// LeleCanzone.cpp - START
#include <string>
#include <vector>
#include <iostream>
// Dichiarazioni using
// solo per ciò che serve
using std::string;
using std::vector;
using std::cout;
using std::cin;
// Dichiarazione per la funzione separa.
// La funzione separa una stringa di input
// utilizzando come separatori i caratteri forniti
// con il parametro sep.
// Ritorna un vettore di stringhe che rappresentano i
// campi contenuti nella stringa di input.
	vector<string> separa(string dati, string separatori);
int main()
{
	//string separatori( "_-." );
	string separatori( "_-" );
	string dati( "Titolo_-Canzone-Versione.mp3" );
 
	vector<string> campi = separa( dati, separatori );
	const size_t nCampi( campi.size() );
	cout << "La stringa contiene: " << nCampi << " campi.\n";
	for(size_t campo(0); campo < nCampi; ++campo){
		cout << "Il campo " << campo;
		cout << " contiene: " << campi[campo] << "\n";
	}
	cout << "\n";
	return 0;
}
// Definizione della funzione separa.
vector<string> separa(string dati, string separatori){
	size_t start( 0 );
	const size_t notFound1( string::npos );
	vector<string> results;
	string campo;
	size_t found = dati.find_first_of( separatori );
	size_t nChars( 0 );
	while( found != notFound1 ){
		nChars = found - start;
		if( nChars != 0 ){
			campo = dati.substr( start, nChars );
			results.push_back( campo );
		}
		start = found + 1;
		found = dati.find_first_of( separatori, start );
	}
/*
	size_t finalCheck = dati.size() - start;
	if( finalCheck > 1){
		campo = dati.substr( start );
		results.push_back( campo );
	}
*/


 // LeleCanzone.cpp - END
Mi raccomando di provare ad usare il debugger. E'indispensabile per
capire dove sono gli errori nei programmi.
Ciao, Ugo

 anche qual'è l'errore: "if( finalCheck > 0)".
Perché da errore?
Al massimo il controllo if è inutile scrivendo cosi si ottiene la stessa
cosa:
     //size_t finalCheck = dati.size() - start;
     //if( finalCheck > 0){
         campo = dati.substr( start );
         results.push_back( campo );
     //}
Grazie per la disponibilità

Ciao Lele,
incomincio con il problema della separazione in campi della stringa
"Titolo_-Canzone-Versione.mp3", dove i separatori di campo sono i
caratteri "_" e "-".
Nel tuo post precedente vedo che hai commentato un blocco di codice
nella funzione "separa":
/*
  size_t finalCheck = input.size() - start;
  if(finalCheck > 1){
    campo = input.substr(start);
    results.push_back(campo);
  }
*/
Togli il commento e modifica la linea "if(finalCheck >1)" in
"if(finalCheck > 0)".
Una volta fatto, prova il programma con la stringa: "Titolo_-Canzone-
Versione.mp3". Il programma produce il seguente output:
La stringa contiene: 3 campi.
Il campo 0 contiene: Titolo
Il campo 1 contiene: Canzone
Il campo 2 contiene: Versione.mp3
Ho scritto la funzione "separa" a scopo didattico. La funzione separa
è utile per il tuo problema ma non si limita a questo. Si può
utilizzare per separare qualunque stringa, delimitata da separatori,
in campi. Per esempio puoi separarare la stringa
"Nome;Cognome;Via;Città;Stato;" utilizzando come stringa di separatori
";". Provare per credere :-)
Viste le premesse, puoi modificare il main del programma così:
int main()
{
	string separatori("_-");
	string dati("Titolo_-C.a.n.z.o.n.e-Versione.mp3");
	vector<string> campi = separa(dati, separatori);
	const size_t nCampi(campi.size());
	cout << "La stringa contiene: " << nCampi << " campi.\n";
	for(size_t campo(0); campo < nCampi; ++campo){
		cout << "Il campo " << campo;
		cout << " contiene: " << campi[campo] << "\n";
	}
	cout << "\n";
	vector<string> sottocampi;
	const size_t indice(2); //il campo Versione.mp3
	if( nCampi > indice ){
		sottocampi = separa( campi[indice], ".");
	}
	const size_t nSottoCampi( sottocampi.size() );
	cout << "Il campo " << indice << " contiene ";
	cout << nSottoCampi << " sottocampi:\n";
	for(size_t campo(0); campo < nSottoCampi; ++campo){
		cout << campo << " contiene: ";
		cout << sottocampi[campo] << "\n";
	}
	return 0;
}
Ciao, Ugo
P.S. Il controllo "if(finalCheck > 0)" non è inutile. Perché?

 P.S. Il controllo "if(finalCheck > 0)" non č inutile. Perché?
E' inutile perché quando il programma sarą completo leggera solo i file 
".mp3" di conseguenza č inutile controllare se č maggiore di 0.
Grazie
Lele

Ciao Ugo,
ho modificato leggermente il tuo programma, ora č adatto per quello che 
dovrą fare. Secondo te va bene? Se si, possiamo andare avanti con il 
prossimo passo. Per esempio con la lettura di dir ma in questo caso non 
saprei da dove iniziare, valuta te cosa č meglio.
#include <iostream>
#include <string>
#include <vector>
using std::cout;
using std::endl;
using std::string;
using std::vector;
vector <string> separa(string);
int main(){
	string canzone ="Autore_-Ca.n.zone-Vers.i.one.mp3";
	vector <string> campi = separa(canzone);
	const size_t Ncampi(campi.size() );
	for (size_t i(0);i < Ncampi;i++)
		cout << "Campo numero "  << i << " " << campi[i] << endl;
	return 0;
}
vector<string> separa (string canzone){
	vector <string> risultato;
	string separatori = "_-";
	size_t start(0);
	size_t end(0);
	size_t found(0);
	string campo = "";
 
	const size_t notFound (string::npos);
	found = canzone.find_first_of(separatori);
	while(found != notFound){
		end = found - start;
		if(end != 0){
			campo = canzone.substr(start,end);
			risultato.push_back(campo);
		}
		start = found + 1;
		found = canzone.find_first_of(separatori,start);
	}
	end = (canzone.size() - 4)  - start;
	campo = canzone.substr(start,end);
	risultato.push_back(campo);
 
	return risultato;
}
Ciao Lele