Nie ma jednej, uniwersalnej metody. Strumienie można otwierać na kilka sposobów - i dobrze.
Podawanie parametrów pliku w konstruktorze sprzyja zasadzie RAII i ja tak zazwyczaj piszę. Przede wszystkim dlatego, że jest to czytelne: tworzę obiekt strumienia i już przy jego definicji widać, do czego konkretnie się on odnosi. No i nie wywołuję metody open(), co oszczędza trochę procesora.
Otwieranie za pomocą metody open() stosuje się przeważnie wtedy, gdy uprzednio się strumień zamknęło. Tworzysz jeden obiekt strumienia, otwierasz jakiś plik, wykonujesz operacje, zamykasz go, potem otwierasz inny plik przy pomocy tego samego strumienia.
Co do trybu otwarcia: przy strumieniach specjalizowanych tylko dla wejścia lub tylko dla wyjścia (np. ifstream, ofstream), nie trzeba jako trybu podawać ios::in czy odpowiednio ios::out - to jest domyślny tryb pracy tych strumieni.
Jeśli chcesz strumień zarówno do zapisu, jak i odczytu, piszesz:
#include <fstream>
int main()
{
std::fstream file("file.txt", std::ios::in | std::ios::out);
if(file.good())
{
int x;
file >> x;
file << " " << x + 20;
}
return 0;
}
Niektóre komentarze do tej odpowiedzi nawiązują do: http://forum.pasja-informatyki.pl/140767/odczyt-i-zapis-z-pliku-do-pliku?show=140935#c140935