Jaki jest najlepszy sposób na odczytanie flag podawanych przy otwarciu pliku za pomocą klasy fstream(ios::binary itd)?
rdstate jest najbardziej naturalnym rozwiązaniem.
aktualnie mam coś takiego:
class FOM final:public std::fstream::__filebuf_type
{
int _getMode(void)
{
return _M_mode;
}
public:
static int getMode(std::fstream::__filebuf_type* buf)
{
return reinterpret_cast<FOM&>(*buf)._getMode();
}
};
a potem:
FOM::getMode(file.rdbuf())
NIE NIE NIE
Nie ma rozsądnego powodu, by był jakikolwiek sens dziedziczyć po std::fstream
! Nadużywanie dziedziczenia to najpowszechniejszy błąd w programowaniu oop.
Na dodatek ten reinterpret_cast
, oraz używanie nie udokumentowanych typów i funkcji (po to są te podkreślenia, by stanowiły ostrzeżenie, że funkcja jest przeznaczona do użytku wewnętrznego biblioteki STL)!
Zacznij od początku i opisz jaką funkcjonalność chcesz zrealizować, bo ewidentnie zszedłeś na manowce, tak że nie wiadomo nawet po co.
chcę sprawdzić czy plik został otwarty w trybie binarnym, dostaję jako parametr funkcji fstream&
Po co ci ta wiedza?
Jak otwiera się strumień z góry wiadomo, czy będzie używany binarnie czy tekstowo i sama logika aplikacji nie powinna wymagać sprawdzenia jak był otwarty plik.
opatrzyłem do kodu STL (na clang na mac) i ta informacja jest zapisana w polu basic_filebuf
(zawarte w basic_fstream
), ale nie jest dostępna na zewnątrz.
Pod spodem jest użyte po prostu API C fopen
z paramentem "b" lub bez.
Jak ci napisałem "Zacznij od początku i opisz jaką funkcjonalność chcesz zrealizować," to miałem na myśli coś w stylu: chcę wczytać plik bmp by zmienić go na czarno biały. Tymczasem ty nadal piszasz, jabyś chciał coś zrobić a nadal nie wiadomo po co chcesz to zrobić.
Takie coś nazywa się problemem XY i im szybciej nauczysz się go omijać tym lepiej.
Mam klasę która ma metodę save, która przyjmuję jako argument fstream& i zapisuje do niego informacje, ale musi je zapisywać inaczej gdy plik jest otwarty tekstowo(by dane były możliwe do odczytu przez człowieka po otwarciu pliku) lub binarnie(by zapisać je binarnie i zajmowały mniej miejsca)