Poszukuję wyjaśnienia, jak działa seekg()
i seekp()
w odniesieniu do zapisu w pliku. Powiedzmy na przykład, że miałem taki plik:fstream seekg(), seekp() i write()
offset 0: 2
offset 4: 4
offset 8: 6
offset 12: 8
offset 16: 10
Teraz chcę otworzyć plik i wykonać pewne czynności, aby odczytać i zapisać wartości.
Teraz chcę napisać na końcu pliku. Ponieważ funkcja seekg()
przesuwa tylko kursor wyszukiwania, mój kursor powinien nadal znajdować się na końcu pliku w prawo? Więc:
int newKey = 12;
file.write((char *) &newKey, sizeof(int));
powinien zrobić mój plik teraz wyglądać następująco:
offset 0: 2
offset 4: 4
offset 8: 6
offset 12: 8
offset 16: 10
offset 20: 12
Teraz co się dzieje z moim pliku jeśli wybiorę dążyć do przesunięcia i napisać swoją wartość jako offset do wartości, która była właśnie włożono. Na przykład chcę, aby offset 8
przechowywał eofOffset = 20
, ponieważ właśnie wstawiliśmy 12 w tym przesunięciu.
Jeśli zrobić:
file.seekp(8, ios::beg);
file.write((char *) &eofOffset, sizeof(int));
to poprawnie przepisać mój plik powinien wyglądać tak:
offset 0: 2
offset 4: 4
offset 8: 20
offset 12: 8
offset 16: 10
offset 20: 12
Proszę dać mi znać, jeśli robię jakieś błędy za pomocą funkcji seekg()
i seekp()
.
Dzięki! Więc kiedy polecasz płukanie bufora? Czy opróżnisz go po każdym czytaniu i pisaniu, czy też będzie w porządku pozostawić go tak, jak robisz serię czytań lub serię pism? – raphnguyen
@raphnguyen Płukanie bufora jest stosunkowo kosztowną operacją, zwykle nie ma potrzeby ręcznego spłukiwania, chyba że zmienisz pisanie na czytanie i nie będziesz szukał, chyba że masz dobry powód do przepłukania, niech implementacja zajmie się innymi kolorami. – user657267