|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
|
[C++] getline e vettore 2D
Codice:
string parserCSV(string& movienameFile, string& multiPlex) { ifstream file(movienameFile.c_str()); const int ROW=3,COL=3; //std::vector<std::vector<string> > array; string array[ROW][COL]; if (file) { for (int i=0; i < ROW; i++) { string line; if (getline(file,line)) { stringstream iss(line); for (int j=0; j < COL; j++) { if (getline(iss, array[i][j], ',')) { cout << "array[" << i << "][" << j <<"] = " << array[i][j] << "\n"; } } } } } else { cout << "Errore apertura file" << endl; } return movienameFile; } Il problema è che vorrei utilizzare un vector 2D, in modo da poter sfruttarela sua dinamicità dimensionale. Ho fatto un paio di test ma non ne sono uscito fuori, avete qualche dritta? Grazie |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
|
Se invece dell'array imposto:
vector<vector<string> > array; senza cambiare nient'altro il programam va in segfault... |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
|
up
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
|
Quote:
Passando a ragionare "bidimensionalmente", oltre a dover fare la push_back sul vector (con elementi di tipo string), devi fare una push_back di tipo vector<string> sul tuo identificatore, così da allocare spazio per il tuo "sottovettore". Più precisamente puoi provare qualcosa di simile: Codice:
string parserCSV(string& movienameFile, string& multiPlex) { ifstream file(movienameFile.c_str()); const int ROW=3,COL=3; vector<vector<string> > array; if (file) { for (int i=0; i < ROW; i++) { vector<string> riga; //una riga vuota, tanto per iniziare a riservare lo spazio per la riga i-esima string line; array.push_back(riga); //notare che riga è ancora vuoto! if (getline(file,line)) { stringstream iss(line); for (int j=0; j < COL; j++) { if (getline(iss, line, ',')) { // riciclo line, tanto l'hai già letta e ci hai creato uno stringstream sopra.. array[i].push_back(line); // a questo punto array[i] esiste (grazie al push_back precedente) e il push_back su di esso, accoda la stringa appena letta cout << "array[" << i << "][" << j <<"] = " << array[i][j] << "\n"; } } } } } else { cout << "Errore apertura file" << endl; } return movienameFile; } Prova a dargli un'occhiata e dimmi se le cose che ti ho scritto ti tornano (lh'o fatto ad occhio..potrei aver commesso qualche piccolo errore, per i quali ti chiedo già scusa!) |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
|
In effetti rileggendo ora avevo scritto proprio una castroneria
![]() ![]() Il codice funziona ottimamente ![]() Già che c'ero volevo chiederti come far ritornare l'array al main, mi conviene passarlo per reference? |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
|
Nel tuo codice ritornavi moviefileName che credo non ti serva (siccome glielo passavi come parametro, dal main conosci già il valore di tale variabile), quindi puoi anche farlo ritornare dalla funzione normalmente. Per fare le cose bene, potresti passarlo by reference, trasformare la funzione in int parserCVS(blah blah) e far ritornare un valore che indica se tutto è andato per il verso giusto, o c'è stato qualche errore (tra cui l'apertura del file). Sarebbe più elegante!
![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
|
No no i passaggio di variabili sono solo di esempio... non sono quei definitivi.
nel main prengo argv[] che lo passa alla funzione, la funzione mi deve ritornare il vettore di vettori. Quindi che dici, inizializzo il vettore nel main e lo passo per reference alla funzione? In questo modo la funzione lavora sul puntatore e a quel punto il passaggio è bello che fatto. Che dici? |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
|
Farei esattamente così (intendo il passaggio by reference)! Inoltre, come ti dicevo sopra, puoi lasciare la funzione di tipo int e far ritornare dalla stessa un codice di controllo (esempio: 0 tutto ok; -1 errore nell'apertura del file; -2 errore in lettura), così da gestire i vari eventi negativi che ti si possono presentare. Immagino, però, che sia un esercizio scolastico, per i quali quest controlli possono anche essere evitati, sbaglio?
![]() |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Io userei le eccezioni per la gestione degli errori. |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
|
Beh..questa è una procedura!
![]() |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
![]() Andare tutte le volte a controllare il valore di ritorno invece è ottimale, magari con un bello switch ![]() E il giorno in cui dovrai aggiungere gli errori -3,-4 ecc è facile che dovrai modificare ovunque tu utilizzi quella funzione. |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Dec 2007
Città: Palestro
Messaggi: 1960
|
lo so..per questo dicevo "se usi Visual Studio"!
![]() Quote:
![]() |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Sep 2004
Città: Rep. San Marino
Messaggi: 633
|
Eccezioni solo con try e catch... come da linee guida del progetto...
Tornando al codice mi sono accorto di un errore concettuale bello grosso... Voglio usare un vettore per sfruttare la dinamicità dimensionale... peccato che poi si definisce: Codice:
const int ROW=3,COL=3; Sto pensando come risolvere, certamente dal file csv devo leggere di quante righe e colonne è fatto, a quel punto posso definire ROW e COL, qualche idea? |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:24.