Newsgroup: it.comp.lang.c++
Titolo: getline

Nelle mie intenzioni il codice cch segue avrebbe dovuto visualizzare 
solo le righe che contengono "createConcept". Invece mi stampa tutto 
"TBox.txt". Dove sbaglio?
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main ()
{
    ifstream mioFile;
    mioFile.open ("TBox.txt");
    string linea;
    while(!mioFile.eof())
    {
       getline(mioFile,linea);
       if (linea.find("createConcept"))
         cout << linea << endl;
    }
    mioFile.close();
    return 0;
}

       if (linea.find("createConcept"))
Perche' quando non viene trovata la stringa, viene ritornato -1...
prova con
    if(0 < linea.find("......."))
B.


Ho appena provato e mi sembra non cambi nulla, possibile?
Comunque ho provato così:
if (1 == linea.find("createConcept"))
funziona.
Le righe che contengono "createConcept" sono *tutte* del tipo:
(createConcept NOMEDELCONCETTO
Quindi se la stringa viene trovata è sicuramente a partire dalla posizione 1
Forse quando non viene trovata la stringa find restituisce npos?
Sì, è sicuramente così, ho provato
if (linea.npos == linea.find("createConcept"))
le righe che contengono "createConcept" non vengono visualizzate.

 le righe che contengono "createConcept" non vengono visualizzate.
Strange,  la numerazione parte da 0 , quindi il mio suggerimento
era errato e avrebbe dovuto essere:
       if (0 <= linea.find("createConcept"))
Quando la tringa non viene trovata, dovrebbe essere restituito -1....
che compilatore stai usando ??
Puoi anche verificare:
int npos= linea.find("createConcept");
cout << "npos=" << npos << endl;
B.

 cout << "npos=" << npos << endl;
Ho provato con
    int pos= linea.find("createConcept");
    cout << "pos=" << pos << endl;
Ottengo 1 per le righe giuste, -1 per quelle sbagliate

 Ottengo 1 per le righe giuste, -1 per quelle sbagliate
Quindi dovrebbe funzionare come previsto, a parte l' '1' che
se è vero che la stringa e' la prima cosa della linea, dovrebbe
ritornare invece 0 ...........
Quindi una cosa cosi' *deve* funzionare :
int pos;
pos=linea.find("createConcept"); 
if(pos >=0)
{
   ...................
}
B.

Mi rispondo da solo... il metodo find ritorna un tipo non segnato
quindi il confronto non e' valido, invece cosi' funziona....
     if( 0<= (int)linea.find("createConcept"))
B.

 ritornare invece 0 ...........
Il primo carattere della riga è la parentesi tonda
[cut]


Esatto, cosě funziona.
Grazie.
Perň.. non so cosa sia un intero "non segnato"

 Però.. non so cosa sia un intero "non segnato"
Nel C e C++ i tipi possono essere segnati o no:
Ovvero i valori possono essere interpretati come
valori assoluti positivi o come valori relativi
(positivi *e* negativi).
Normalmente i tipi si intendono con segno: il linguaggio
poi fornisce la key word "unsigned" per indicare che un
tipo contiene solo valori positivi.
Lo scopo dell' unsigned è che nello steso spazio
della variabile (supponiamo un char), puoi memorizzare
un valore positivo doppio rispetto a quello rappresentabile
in un tipo segnato.
Esemplifico:
char p;    /* tipo carattere con segno,
             *   da -127 a +128 (max positivo)
             */
unsigned char p;  /* tipo carattere senza segno,
                    * da 0 a 255 (0xFF) max positivo!
                    */
La gestione del segno e' 'implementation dependent'
ma tradizionalmente si utilizza la notazione complemento
a 2 negato per rappresentare i valori positivi e negativi.
Quindi un intero segnato (supponiamo di 16bit), ha un range
di valori binari compreso tra 0x0000 e 0xFFFF:
i valori tra 0x0000 e 0x7FFF sono valori interi (da 0 a 32767),
i valori tra 0xFFFF e 0x8000 sono valori negativi
(0xFFFF= -1, 0x8000= -32768).
Se lo stesso valore e' di tipo NON segnato, la sua rappresentazione
conterrà solo valori positivi compresi tra 0 e 65535 (0xFFFF).
Se una funzione ritorna un valore unsigned (supponiamo di 16 bit)
fare un confronto con un valore negativo non ha senso, anzi!
Quindi, nel nostro caso, il valore del tipo ritornato (-1)
non segnato viene interpretato come valore 65535(se a 16bit) o
come 4294967295 (se 32bit), per cui il test per "minore di 0"
non andrà mai a buon fine. il recast a int (signed) invece
forza il confronto a trattare il ritorno con il segno :-)
Non so' se sono stato chiaro...
B.

 Perche' quando non viene trovata la stringa, viene ritornato -1...
No, viene tornato string::npos. Il metodo che suggerisci in seguito è 
concettualmente sbagliato, anche se funziona. Dunque la soluzione giusta 
dovrebeb essere:
if (linea.find("dsalkf")!=string::npos)
E.

 if (linea.find("dsalkf")!=string::npos)
Si e' cosi, bastava leggersi la documentazione :-(
B.

 if (linea.find("dsalkf")!=string::npos)
Esatto.
Io avevo provato linea.find("createConcept")==linea.npos e mi dava tutte 
e solo le righe sbagliate.
Conif(linea.find("createConcept")!=linea.npos)
trovo tutte le righe che mi interessavano

 Dipende forse dal compilatore mentre npos č standard?
Visto che find ritorna la posizione della substring nella stringa, deve 
essere un
valore positivo, e poiche' 0 č un valore legale, occorre definire un
valore univoco per "non trovato".
Il valore npos "nullo" vale proprio -1 (ovvero 0xFFFFFFFF=4294967295 ).
Pero' essendo implemetation dependent, meglio seguire la via standard.
Se un compilatore decidesse di usare un altro valore per "non trovato"
il codice rischia di non funzionare piů: invece se confronti per npos
funziona sempre.
B.

 Pero' essendo implemetation dependent, meglio seguire la via standard.
Anche perché se la stringa fosse MOOOOLTO lunga, quando aggiungi il 
segno al valore di ritorno del find, potrebbe diventarti negativo anche 
un valore valido.
E.

?manu* ha scritto:

Gia',moolto moolto lunga, piů o meno 2Giga di stringa :-)
B.