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

Jak dodać do pliku bajt 00000000?

VPS Starter Arubacloud
+1 głos
176 wizyt
pytanie zadane 18 kwietnia 2020 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

Przykładowy kod:

#include <fstream>

using namespace std;

int main()
{
short x1 = 65111;
short y1 = 55222;

short x2 = 7;
short y2 = 8;

fstream plik;
plik.open( "plik.txt", ios::in | ios::out );

plik << (char)( x1 / 256 );
plik << (char)( x1 % 256 );
plik << (char)( y1 / 256 );
plik << (char)( y1 % 256 );

plik << (char)( x2 / 256 );
plik << (char)( x2 % 256 );
plik << (char)( y2 / 256 );
plik << (char)( y2 % 256 );

plik.close();

return 0;
}

Problem pojawia się w miejscu 

plik << (char)0

Bo poprostu nic się nie dzieje. Nie dodaje to do pliku bajtu 00000000. Co mogę z tym zrobić? I byłbym wdzięczny jakby mi ktoś przy okazji napisał czy tam powinno być /256 i %256, oraz czy to powinien być (char) czy (unsigned char) i jak to wgl powinno wyglądać

komentarz 18 kwietnia 2020 przez NewEraOfPeace Gaduła (4,790 p.)

bajt 0 to null cool

komentarz 18 kwietnia 2020 przez Daaa22 Dyskutant (8,250 p.)
Tzn jak ten kod powinien wyglądać?
komentarz 18 kwietnia 2020 przez tangarr Mędrzec (154,780 p.)
Jeżeli chcesz pracować na danych binarnych to otwórz plik w trybie binarnym.
komentarz 18 kwietnia 2020 przez Daaa22 Dyskutant (8,250 p.)
Nawet jak binarnie otwieram to plik<<(char)0 nic nie robi
2
komentarz 18 kwietnia 2020 przez tangarr Mędrzec (154,780 p.)

Zamiast operatora << użyj funkcji write.

char c = 0;
plik.write(c, 1);
int x = 0;
print.write((char*)&x, sizeof(x));

 

komentarz 18 kwietnia 2020 przez Daaa22 Dyskutant (8,250 p.)
A mam używać char czy unsigned char?
2
komentarz 18 kwietnia 2020 przez tangarr Mędrzec (154,780 p.)
Jak ci wygodnie. Binarna reprezentacja jest taka sama.

2 odpowiedzi

+3 głosów
odpowiedź 18 kwietnia 2020 przez SimiVoid Pasjonat (19,790 p.)
plik << '\0';

Bajt 0 -> NULL, a NULL w tablicy ASCII ma kod 0

komentarz 18 kwietnia 2020 przez Daaa22 Dyskutant (8,250 p.)
A jak to powinno wyglądać z zapisem i odczytem zmiennej char której wartość jest między 0 a 255? Bo zauważyłem że program ma jeszcze problemy z wartością 9 i chyba 10. I podkreślam że jest to zmienna więc nie chce pisać "\0\"
+2 głosów
odpowiedź 18 kwietnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)
edycja 19 kwietnia 2020 przez Piotr Batko

Jak nie działa, jak działa :) Niezależnie od tego czy wpisuję z zastosowaniem rzutowania czy bez. Poniżej działający przykład, ale zanim to jeszcze pytanie. Wiesz, że jak zrobisz tak, to nic nie zobaczysz?

std::cout << '\0' << std::endl;

Obiecany przykład. Uruchom na godbolt.org

#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>

int main()
{
    std::string file_name = "test.bin";

    // Write
    {
        std::ofstream file(file_name, std::ios::binary);
        for (unsigned int i = 0; i < 256; ++i)
        {
            unsigned char c = static_cast<unsigned char>(i);
            file.write(reinterpret_cast<char *>(&c), sizeof(c));
        }
    }

    // Read and print
    {
        std::ifstream file(file_name, std::ios::binary);

        std::cout << std::setfill('0');

        unsigned char c;
        while (file.read(reinterpret_cast<char *>(&c), sizeof(c)))
        {
            std::cout << "0x" << std::hex << std::setw(2)
                      << static_cast<unsigned int>(c) << std::endl;
        }
    }
}

 

komentarz 18 kwietnia 2020 przez Daaa22 Dyskutant (8,250 p.)
A jak to powinno wyglądać z zapisem i odczytem zmiennej char której wartość jest między 0 a 255? Bo zauważyłem że program ma jeszcze problemy z wartością 9 i chyba 10. I podkreślam że jest to zmienna więc nie chce pisać "\0\"
komentarz 19 kwietnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)

Faktycznie to nie działało dla 9, 10, 11, 12, 13, 32. Jak zerkniesz do tabeli ASCII, to zobaczysz, że są to znaki białe (spacje, taby, itp.). Działo się tak dlatego, bo operator>> pomija białe znaki. Gdy napiszesz kodzik:

char a;
char b;
std::cin >> a >> b;

i na klawiaturze wpiszesz "X<spacja>Y<enter>" to do zmiennej b nie trafi spacja, tylko Y. Spacja to 32 (0x20), więc w poprzednim przykładzie była ona przeskakiwana i dlatego nie była ona odczytywana z pliku operatorem>>. Podobnie inne białe znaki, 9 i 10 jak zaobserwowałeś :)

Przykład który podałem wyżej zawierał parę innych błędów, więc edytowałem go i zamieściłem poprawiony kod.

komentarz 19 kwietnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)

Odniosę się jeszcze do:

I byłbym wdzięczny jakby mi ktoś przy okazji napisał czy tam powinno być /256 i %256 (...)

Jeżeli chcesz, żeby to po prostu ruszyło u Ciebie na kompie, to możesz zrobić tak:

int i = 42;
file.write(reinterpret_cast<char *>(&i), sizeof(i));
file.read(reinterpret_cast<char *>(&i), sizeof(i));

i nie bawić się w te dzielenia. To będzie u Ciebie działać, ale jeżeli zaczniesz przenosić program i zapisane pliki pomiędzy komputerami, mogą się pojawić problemy. Wynika to z tego, że int nie zawsze ma 4B i kolejność bajtów w pamięci nie zawsze jest taka sama (google: endianness).

Nie wiem czy potrzebujesz wchodzić w ten temat aż tak głęboko, ale jeżeli tak, to możesz zacząć poszukiwania poprawnego rozwiązania tutaj: https://stackoverflow.com/questions/39946803/writing-to-a-binary-file-in-c

Podobne pytania

+1 głos
1 odpowiedź 377 wizyt
pytanie zadane 17 listopada 2020 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
0 głosów
2 odpowiedzi 710 wizyt
pytanie zadane 19 kwietnia 2020 w Systemy operacyjne, programy przez tonn204 Mądrala (7,440 p.)
0 głosów
3 odpowiedzi 7,123 wizyt
pytanie zadane 13 marca 2018 w Offtop przez Hiskiel Pasjonat (22,830 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...