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

Odczyt/zapis binarny c++

Object Storage Arubacloud
+1 głos
4,377 wizyt
pytanie zadane 13 grudnia 2016 w C i C++ przez Dominik Kulis Użytkownik (720 p.)
Potrzebuję, zapisać do pliku liczę całkowitą zajmująco do 2 bajtów. Gdy zapisuje/odczytuje za pomoca >>/<< lub read()/write() zapisuje mi do pliku wartości ASCII. Jest ktoś wstanie pomóc mi w jaki sposób mógłbym pozbyć się tego problemu?

2 odpowiedzi

0 głosów
odpowiedź 13 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
komentarz 13 grudnia 2016 przez Dominik Kulis Użytkownik (720 p.)
Wszystko się zgadza, ale problem jest w tym, że jak napisze

output.write((char*)&temp, sizeof(int));

wszystko działa, ale jeśli napisze

output.write((char*)&temp, sizeof(char) * 2);

program wywala błąd
komentarz 13 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
Jaki błąd? Pokaż więcej kodu.
komentarz 13 grudnia 2016 przez Dominik Kulis Użytkownik (720 p.)
Program się normalnie kompiluje. Wywala błąd w trakcie odczytu danych z pliku.
komentarz 13 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
Kod, pokaż kod.
komentarz 13 grudnia 2016 przez Dominik Kulis Użytkownik (720 p.)

Odczyt pliku: 
while(!input.eof())
    {
        int color;
        input.read((char*)&color, sizeof(char)*2);
        while(color != huffmanCode[j].first)
        {
            ++j;
        }
        int temp = huffmanCode[j].second;
        output.write((char*)&temp, sizeof(char));
        j = 0;
    }

 

Zapis do pliku:

    for(int i = 0, j = 0; i < *dataSize; ++i)
    {
        while(data[i] != huffmanCode[j].first)
            ++j;

        int temp = atoi(huffmanCode[j].second.c_str());
        temp = binToDec(temp);

        output.write((char*)&temp, sizeof(char) * 2);
        j = 0;
    }

 

komentarz 13 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
Zmienna color jest nie zainicjalizowana.
komentarz 13 grudnia 2016 przez Dominik Kulis Użytkownik (720 p.)
Jest ona odczytywana z pliku. Zastosowanie shorta pomogło ale nadal do pliku zapisywane są kody ascii a nie liczby tak jak potrzebuje.
komentarz 13 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
Problem z intem był taki że z pliku odczytywałeś tylko 2 bajty i zapisywałeś je do 2 najmniej znaczących bajtów w int, podczas gdy te najbardziej znaczące zawierały śmieci.
 

Do pliku są zapisywane liczby, ale binarnie. Gdy otworzysz plik w notatniku to on traktuje bajty jako kody ascii i je wyświetla, ale w rzeczywistości w pliku zapisane są liczby. Najłatwiej to sprawdzić otwierając plik binarny w hex-edytorze.
–2 głosów
odpowiedź 13 grudnia 2016 przez Macek Kolo Mądrala (5,480 p.)
#include <fstream>     

int main () {

  std::fstream fs;
  fs.open ("test.txt", std::fstream::out | std::fstream::binary);

  fs << " more lorem ipsum";

  fs.close();

  return 0;
}

A to nie jest rozwiązanie? 

komentarz 13 grudnia 2016 przez Dominik Kulis Użytkownik (720 p.)
Ale potrzebuję ograniczyć zapis/odczyt do 2 bajtów.
komentarz 13 grudnia 2016 przez unknown Nałogowiec (39,560 p.)
W trybie binarnym nie powinno się używać operatora <<
komentarz 13 grudnia 2016 przez Macek Kolo Mądrala (5,480 p.)
@Dominik Kulis no to podaj mu short, albo strukturę w której obetniesz char do 2 bajtów.

@unknown nie wiedziałem, na stronie cppreference nic nie znalazłem, że to źle.

Podobne pytania

0 głosów
0 odpowiedzi 583 wizyt
pytanie zadane 6 kwietnia 2017 w C i C++ przez 10kw10 Pasjonat (22,880 p.)
0 głosów
1 odpowiedź 1,819 wizyt
pytanie zadane 27 września 2017 w C i C++ przez B0nkers Początkujący (310 p.)
0 głosów
1 odpowiedź 341 wizyt
pytanie zadane 17 grudnia 2018 w C i C++ przez tomekrx Nowicjusz (160 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...