2013-01-03 8 views
5

Dies ist eine Art von einer einfachen Frage, die ich hoffe, kann leicht beantwortet werden, den Dateistream lesen und schreiben Operationen bewegen den Zeiger entlang? Als Beispiel:tut fstream lesen/schreiben Dateizeiger bewegen

cpos=10000; 
for (i=0;i<20;i++) { 
    dataFile.seekg(cpos+i,ios::beg); 
    dataFile.read(carray[i],1); 
} 

Ist es identisch (logisch) zu:

dataFile.seekg(cpos,ios::beg);  
cpos=10000; 
for (i=0;i<20;i++) { 
    dataFile.read(carray[i],1); 
} 

Mit anderen Worten, CArray [] die gleichen Inhalte, unabhängig davon enthält Methode verwendet wird (ich nicht sehen kann die erste Methode ist effizient, so hoffe ich, dass die richtige Antwort ja ist). Wenn ja, wird das gleiche Verhalten von Schreiboperationen gezeigt?

Antwort

5

Ja, so funktioniert es. Ihre Beispiele sind jedoch nicht ganz gleich. Ihr erstes Beispiel liest von 10000, dann 10001, dann 10002 usw. Das zweite Beispiel benötigt eine Suche außerhalb der Schleife, um die Anfangsposition festzulegen. Zu 100% entspricht, müssen Sie Ihr zweites Beispiel haben, wie folgt aussehen:

cpos=10000; 
dataFile.seekg(cpos,ios::beg); 
for (i=0;i<20;i++) { 
    dataFile.read(carray[i],1); 
} 
+0

Entschuldigung, ich weiß das - ich demonstrierte nur das Nicht-Suchen in der Schleife. Danke für die Bestätigung. – mlewis54

1

Ja, wird der Dateizeiger automatisch von Lese bewegt und Schreiboperationen. ... und nicht Suche verbessert die Leistung viel. Auch die Verwendung von file.read(ptr, 20) ist viel schneller als die Verwendung von 20 mal file.read(ptr + i, 1). Um dieselbe Semantik zu erhalten, müssen Sie jedoch mit einem Suchvorgang zum entsprechenden Speicherort navigieren.

Wenn Sie in einem Dateistream suchen, wird der Stream in einen Zustand versetzt, in dem er weiterhin Zeichen lesen oder schreiben kann: Um zwischen Lesen und Schreiben für einen im Lese-/Schreibmodus geöffneten Stream umzuschalten (std::ios_base::in | std::ios_base::out), muss a eingeführt werden suchen. Jeder sieht also den verfügbaren Puffer auf eine lustige Art und Weise auf, die der Stream nicht tun muss, wenn er nur eine Folge von Zeichen liest oder schreibt. Beim Schreiben jeder Suche wird zumindest überprüft, ob es notwendig ist, Zeichen zu schreiben, um in einen Anfangszustand für die Code-Umwandlung zu gelangen.