PDA

View Full Version : [C++] Banale problema Vector


Unrue
10-01-2008, 09:29
Ciao ragazzi,
sto usando un vector di string per acquisire le righe di un file. Ora,questo file ha 39370 righe. Solo che, una volta pienato il vector, la size() me ne conta una in più! Questo è il codice(solo le parti rilevanti):


vector<string> vettore_stringhe;
int example =1;

while(!dati_ascii.eof())
{

cout << " Esempio : " << example << endl;
getline (dati_ascii,line);
vettore_stringhe.push_back(line);
line.clear();
example++;

}

cout << "size " <<vettore_stringhe.size()<< endl;

:confused: Infatti,quando poi vado ad estrarre delle sottostringhe, arrivata all'ultima mi si impalla e schianta.

Poi un altro dubbio: che differenza c'è tra line.clear() e line.erase() ? Thanks

Unrue
10-01-2008, 09:49
:doh:

Basta cambiare il while :

while(getline (dati_ascii,line))

Ovviamente togliendo getline da dentro il ciclo.

Però permane il mio secondo dubbio.

cionci
10-01-2008, 10:32
erase in teoria è una funzione un po' più complessa perché gli si può passare l'intervallo di caratteri da eliminare.
erase inoltre viene mantenuta per compatibilità con la nomenclatura degli altri contenitori standard.
clear suppongo che al suo interno sia solo una chiamata ad erase ;)

cionci
10-01-2008, 10:36
Se volevi mantenere, per un qualsiasi motivo l'altro ciclo, ti bastava fare:

while(!dati_ascii.eof())
{

cout << " Esempio : " << example << endl;
getline (dati_ascii,line);
if(!dati_ascii.eof())
{
vettore_stringhe.push_back(line);
line.clear();
example++;
}
}

L'end of file sia in C che in C++ viene settato quando si tenta di fare una lettura e non ci sono più caratteri disponibili.

Unrue
10-01-2008, 10:37
erase in teoria è una funzione un po' più complessa perché gli si può passare l'intervallo di caratteri da eliminare.
erase inoltre viene mantenuta per compatibilità con la nomenclatura degli altri contenitori standard.
clear suppongo che al suo interno sia solo una chiamata ad erase ;)
Come supponevo, infatti se ad erase non passi gli indici, non vedo la differenza. Ok, grazie :)