Domanda

Sto inizialmente costruendo un indice simile meccanismo, leggere ogni riga del file di testo utilizzando getline, controllando se corrisponde una dichiarazione nota intestazione (string.compare) e la memorizzazione della posizione tellg come indice per quel punto. La mia intenzione è quindi di utilizzare seekg (indice, ios :: BEG) per cercare il posto nel file in cui l'intestazione è. Dopo la lettura attraverso il file una volta quando si costruisce il mio indice e chiamando seekg (0, ios :: BEG) il prossimo getline restituisce una stringa vuota dove mi aspetto di vedere la prima riga del file.

una parte del mio codice è inferiore a una migliore evidenziazione mio problema

//build the index
while (! m_fileIn.eof())
{
   getline (m_fileIn,lineRead);
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

// start reading the file data
m_fileIn.seekg(0,ios::beg);
//read first line (title)

la funzione getLineID restituisce un int a seconda del risultato del confronto tra stringhe.

è l'uso di getline errato se ho bisogno di ri-leggere il file?

È stato utile?

Soluzione

Il problema è causato perché si ha un po 'cattivo impostato all'interno del flusso.
Operazioni sul torrente verranno ignorati fino a quando il bit Bad è stato reimpostato.

// After the loop reset the Bad Bits.
m_fileIn.clear()

Nota: A Bad bit è una delle tante condizioni di errore compreso EOF

Ma questo non è il tuo grossi problemi:

Si utilizza la Classic anti pattern per la lettura di un file:
Piuttosto utilizzare questo.

while (getline (m_fileIn,lineRead))
{
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

Il problema è che l'EOF non è impostato fino a leggere oltre.
L'ultima lettura valida legge FINO ma non oltre l'EOF (quindi EOF non è impostata).

In modo da considerare la situazione in cui avete letto l'ultima riga del file. L'EOF non è stato impostato come non avete letto passato. Così si entra nel ciclo. A questo punto eseguire getline (). Questo cerca di leggere EOF passato in quanto non v'è assolutamente alcun dati da leggere (non un singolo byte). Così getline () non riesce ora si sta chiamando getlineID () utilizzando lineRead il cui valore è indeterminata (la norma non dice cosa succede a lineRead quando la condizione EOF viene colpito, ma probabilmente ha il valore di ultima riga letta come tu non sembri per ripristinarlo all'interno del ciclo).

Un altro problema con questo codice è che solo i controlli per EOF. Cosa accade quando si verifica un altro tipo di errore? Il ciclo in realtà si blocca in un ciclo infinito; Questo perché quando viene impostato un flag di errore non è più la lettura avviene in modo non si può mai raggiungere l'EOF.

while (! m_fileIn.eof())
{
   getline (m_fileIn,lineRead)
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

La soluzione è quella di effettuare l'operazione di lettura nel test ciclo while. Questo funziona perché getline () restituisce il flusso trasmesso come primo parametro. Pertanto, il flusso viene utilizzato in un contesto booleano. Quando una corrente viene utilizzato in un contesto booleano viene convertito in un tipo che può essere utilizzato come boolean; il valore di questo oggetto è equivalente vero se non ci sono errori e false altrimenti.

In questa situazione il lettura è tentato di sorprendere se fallisce non è mai entrato nel circuito.

Altri suggerimenti

Dopo aver postato qui e la pesca a strascico vari siti web ho aggiunto la riga

m_fileIn.clear();

prima della riga

getline (m_fileIn,lineRead);

deselezionando le bandiere di errore (sto assumendo EOF errore) sono stato in grado di continuare come normale.

Martin -. Sarei davvero curioso di saperne di più sulla anti-modello che ho usato inconsapevolmente, ho aggiornato il mio codice per includere le modifiche, molte grazie

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top