• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed zapisywanie unsigned int w pliku

0 głosów
118 wizyt
pytanie zadane 3 grudnia 2020 w C i C++ przez Mateusz1223 Bywalec (2,440 p.)
zamknięte 3 grudnia 2020 przez Mateusz1223

Witam,

Czy ma ktoś pomysł w jaki sposób mogę zapisać w elegancki sposób zmienną typu unsigned int w pliku nie przekształcając jej w tekst. Mówiąc elegancki sposób mam na myśli unikanie funkcji fwrite z c:

fwrite(variable, sizeof(unsigned int),1,file);

oraz przekształcania pojedynczych bajtów int'a na char'y.

komentarz zamknięcia: Otrzymałem odpowiedź
komentarz 3 grudnia 2020 przez tangarr VIP (140,280 p.)
Co jest nieeleganckiego w zapisie bezpośrednio z pamięci do pliku binarnego?
komentarz 3 grudnia 2020 przez Mateusz1223 Bywalec (2,440 p.)
Kompilator VisualStudio wyrzuca warningi które trzeba wyciszać aby uruchamiać program w ide. Z jakiegoś powodu nie lubi tych starych funkcji z c.
komentarz 3 grudnia 2020 przez tangarr VIP (140,280 p.)
Piszesz w C czy C++?
Jaka jest treść warninga?
komentarz 3 grudnia 2020 przez Mateusz1223 Bywalec (2,440 p.)
Piszę w c++ i chciałbym korzystać z ofstream nie z FILE.

Warning czepia się funkcji fopen:

Error    C4996    'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
komentarz 3 grudnia 2020 przez j23 Mędrzec (176,760 p.)
std::ofstream os("plik", std::ios::binary);

os.write(reinterpret_cast<char*>(&variable), sizeof(variable));

 

1 odpowiedź

0 głosów
odpowiedź 3 grudnia 2020 przez tangarr VIP (140,280 p.)
wybrane 3 grudnia 2020 przez Mateusz1223
 
Najlepsza

Strumienie w C++ mają metodę write, która działa tak samo jak funkcja fwrite.
Jedyną różnicą jest to, że musisz jawnie rzutować adres bufora na typ const char*.

std::ofstream file;
file.open("/tmp/test.bin", std::ios_base::binary | std::ios_base::out);
unsigned long number = 1;
file.write(reinterpret_cast<const char*>(&number), sizeof(number));
file.flush();
file.close();

Jak chcesz to możesz napisać szablon, który sam zadba o przekazanie odpowiedniego rozmiaru na podstawie typu danych.

template <typename T, typename std::enable_if<std::is_fundamental<T>::value, bool>::type = true>
void myWrite(std::ostream &out, const T& value) {
    out.write(reinterpret_cast<const char*>(&value), sizeof(value));
}

 

komentarz 3 grudnia 2020 przez Mateusz1223 Bywalec (2,440 p.)
Aby odczytać tą liczbę z pliku to też mogę użyć reinterpret_cast ?
komentarz 3 grudnia 2020 przez tangarr VIP (140,280 p.)

Tak, ale do odczytu musisz użyć typu char*

Podobne pytania

+3 głosów
4 odpowiedzi 1,156 wizyt
pytanie zadane 30 czerwca 2015 w C i C++ przez Phobos Użytkownik (720 p.)
0 głosów
1 odpowiedź 109 wizyt
pytanie zadane 8 czerwca 2021 w Java przez Paluch22 Nowicjusz (230 p.)
+1 głos
0 odpowiedzi 71 wizyt
pytanie zadane 24 września 2021 w JavaScript przez Maxxxii Obywatel (1,240 p.)

88,677 zapytań

137,288 odpowiedzi

306,652 komentarzy

58,873 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...