Odczyt\Zapis pliku - strumienie dwukierunkowe

0

Załóżmy że potrzebny jest mi program który szuka konkretnych wartości w pliku i zamienia je na inne (lub przepisuje w inne miejsce). Z racji rozmiarów pliku nie można (nie powinno się) go wczytać w całości do pamięci programu.

Czy ktoś próbował używać strumieni dwukierunkowych dla zapisu\odczytu plików? Nigdzie nie mogę znaleźć informacji na temat czegoś takiego, ale z doświadczeń wynika że to działa.
Zrobiłem coś takiego:

fstream file_str;
file_str.clear();
file_str.open( str, ios::in|ios::out|ios::binary|ios::ate ); // read-write binary mode, go to EOF

if( file_str.good() )
{
	int file_size = file_str.tellg(); // get pos (EOF)
	file_str.seekg(0); // back to file start
	(...)

Swego czasu to działało, ale miałem problemy z poruszaniem się po pliku. Zauważyłem zę po zapisie musiałem używać metod dla strumienia wyjściowego, po odczycie tych dla wejściowego. Trochę skomplikowałem program i w ogóle przestało działać...

Wie ktoś jak poprawnie się obsługiwać takim dwukierunkowym strumieniem?

0

A czasem ios::ate nie psuje tutaj poruszania się po pliku?

0

ios::ate sprawia że po otwarciu pliku karetka strumienia jest ustawiona na koniec pliku, dzięki czemu mogę sprawdzić jego długość.

0

strumienie dzialaja dwukierunkowo bardzo dobrze, jesli bedziesz trzymac sie kilku regul

  • musisz pilnowac miedzy 'karetkami' GET i PUT, dlatego sa funkcje seekG/seekP oraz tellG/tellP

  • strumienie sa buforowane, wiec jesli nie calkiem wiesz co robisz, to pomiedzy KAŻDĄ chwilowa zmiana trybu pracy miedzy czytaniem a zapisem i vice versa, musisz wymusic sflushowanie buforow, zwykle robi sie to przez odpowiedni seekG/P nie zmieniajacy pozycji 'karetki'

  • jesli wiesz co robisz i umiesz zagwarantowac, zeby ptrG i ptrP pokazywaly poza te same bloki pliku, to teoretycznie nie musisz flushowac przy kazdej zmianie kierunku operacji, "ale.."

0

Ok, pomyliło mi się z ios::app który:

app (append) Set the stream's position indicator to the end of the stream before each output operation.

http://www.cplusplus.com/reference/iostream/fstream/open/

1 użytkowników online, w tym zalogowanych: 0, gości: 1