2017-05-15 4 views
-2

Ich habe eine Frage, nachdem ich auf eine Datei loop und mehrere Buchstaben mit einem Zähler extrahieren, um zu wissen, wie viele Zeichen extrahiert worden sind, wie kann ich meinen Zeiger neu positionieren, um zurück zu zeigen der erste wurde extrahiert. Hier ist, was ich bisher versucht:Rückkehr zu einer bestimmten Stelle in einer Datei nach der Extraktion von Zeichen

int get_length(ifstream &inp,int &length){ 
    int columns=0; 
    inp>>columns; 
    length++; 
    while(columns!=0) 
    { 
    inp>>columns; 
    length++; 
    } 
    if (!inp.good()) 
     inp.clear(); 

    inp.seekg(-length,std::ios::cur); 
    return length; 
} 

Aus irgendeinem Grund ist es nicht wieder die gleiche Länge gehen, es wird es falsch nach dem anderen, habe ich versucht, durch eine auf Länge Hinzufügen dann diese Funktion zu schreiben versuchen, ich don Ich weiß nicht, was hier falsch ist. Ich frage, ob ich die Suchfunktion falsch benutze.

+0

Der Code erhöht "Länge" eine zusätzliche Zeit. Wenn der Wert, der in 'columns' eingelesen wird, null ist, sollte er ** nicht' länge' erhöhen. –

+0

Erhöht die 'length' die Anzahl der übersprungenen Leerzeichen? – Galik

+1

Lesen Sie über 'std :: basic_istream :: tellg()'. –

Antwort

0

Ich denke, dass das Problem ist: Sie erhöhen "Länge" jedes Mal, wenn ein Integer-Wert aus dem fstream 'inp' gelesen wird. Abhängig davon, wie viele Zeichen die Integer-Darstellung breit ist, müssen Sie die Länge um diesen Betrag erhöhen. Das und neue Zeilenzeichen und alle anderen Leerzeichen im Stream.

Wenn Ihre Testdaten enthält:

10 
11 
12 
13 

Dann durch die Zeit, die Sie 13 lesen Sie 12 Bytes von Dateidaten verbraucht haben wird. Ihr Zähler wird nur 4 Mal erhöht.

Man könnte dies leichter tun und genau durch einen Aufruf an

platzieren
auto const position_start = inp.tellg(); 

zu Beginn Ihrer Funktion und sobald Sie die Daten lesen Sie sich interessieren ‚rewind‘ in die Startposition mit einem nennen

inp.seekg(position_start, std::ios::beg); 
+0

danke das war das problem, die idee von whitespaces flog direkt über meinen kopf –

0

'ifstream' eine Spezialisierung von 'basic_ifstream' ist, so 'ifstream :: seekg()' nimmt einen Offset in Bytes (Zeichen). Die formatierte Eingabe (zu einem Int) wird jedoch die aktuelle Position um eine bestimmte Anzahl von Bytes (0 oder mehr) vorrücken, wenn die Eingabe in einen ganzzahligen Wert konvertiert wird. Verwenden Sie 'ifstream :: tellg()' am oberen Rand der Funktion, um die aktuelle Dateiposition und einen weiteren Aufruf von 'tellg()' zu erhalten, bevor 'seekg()' aufgerufen wird, um die neue Dateiposition zu erhalten. Der Unterschied zwischen den beiden Werten ist "Länge".

Verwandte Themen