2013-01-03 10 views
5

To proste pytanie, na które mam nadzieję, można łatwo odpowiedzieć, czy operacje odczytu i zapisu strumienia plików przesuwają wskaźnik wzdłuż? Jako przykład:czy wskaźnik ruchu pliku odczytu/zapisu fstream

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

czy to identyczne (logicznie) na adres:

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

Innymi słowy, czy carray [] zawiera te same treści, niezależnie od których stosowana jest metoda (nie widzę pierwsza metoda jest skuteczna, więc mam nadzieję, że poprawna odpowiedź brzmi "tak"). Jeśli tak, czy to samo zachowanie przejawia się w operacjach zapisu?

Odpowiedz

5

Tak, tak to działa. Twoje przykłady nie są jednak takie same. Twój pierwszy przykład czyta od 10000, potem 10001, potem 10002 itd. Drugi potrzebuje poszukiwania poza pętlą, aby ustawić początkową pozycję. Aby być w 100% równowartości, trzeba mieć swój drugi przykład wyglądać tak:

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

Przepraszam, wiem o tym - po prostu demonstrowałem, że nie szukam w pętli. Dzięki za potwierdzenie. – mlewis54

1

Tak, wskaźnik pliku jest automatycznie przemieszczane operacji odczytu i zapisu. ... i nie poszukuje poprawia wydajność dużo. Ponadto użycie numeru file.read(ptr, 20) jest dużo szybsze niż użycie 20-krotnego polecenia file.read(ptr + i, 1). Aby uzyskać tę samą semantykę, musisz przejść do odpowiedniej lokalizacji, używając jednego wyszukiwania.

Poszukiwanie w strumieniu pliku ustawia strumień w stan, w którym może kontynuować zarówno odczytywanie, jak i pisanie znaków: Aby przełączać się między odczytywaniem i zapisywaniem strumienia otwartego w trybie odczytu/zapisu (std::ios_base::in | std::ios_base::out), konieczne jest wprowadzenie szukać. Każdy widzi, w ten sposób ustawia dostępny bufor w zabawny sposób, którego strumień nie musi robić, jeśli po prostu czyta lub zapisuje sekwencję znaków. Ponadto przy pisaniu każdego wyszukiwania przynajmniej sprawdza, czy konieczne jest pisanie znaków, aby uzyskać stan początkowy konwersji kodu.

Powiązane problemy