Plik binarny #binarny

Plik binarny #binarny
SO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:19
0

Cześć. Co oznacza "0Řa", mógłby ktoś wytłumaczyć ?

  • c++.png (25 KB) - ściągnięć: 101
ZA
  • Rejestracja:ponad 12 lat
  • Ostatnio:9 miesięcy
5

Te dziwne znaki to próba wypisania fragmentu pamięci za adresem &tresc[6]. W C i C++ cstring jako tablica charów musi być zakończony bajtem o wartości 0 ('\0' w zapisie jako char).
Linia cout << tresc << setw(5) << endl; wypisuje taki string do napotkania pierwszego bajtu o wartości 0. Po deklaracji char tresc[15];, wartości poszczególnych elementów są niezdefiniowane i ciężko określić, co zawierają. Aby żaden niepożądany ciąg nie został wypisany, wystarczy zapewnić, że następnym znakiem w ciągu będzie 0.
Widać to dosadniej przy drugim wypisaniu, gdzie program wczytał 6 znaków, więc następnym było t z poprzedniego wczytywania.

SO
Chyba rozumiem, dziękuję
ZK
  • Rejestracja:około 19 lat
  • Ostatnio:4 miesiące
0

@zagura:

Te dziwne znaki to próba wypisania fragmentu pamięci za adresem &tresc[6]

a skąd to wiesz ? Gdzie można dowiedzieć się takich rzeczy ?


bla
_13th_Dragon
Z analizy podanego kodu.
SO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:19
0

A teraz w jaki sposób mogę zmienić kod, aby na końcu uniknąć wyświetlania tego "te" ? Bo w pliku mam zapisane tylko "To jest tekst"

tajny_agent
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:1340
1

Primo: Wstawiaj kod w formie tekstu a nie obrazków.
Skoro w pliku masz "To jest tekst" a w pętli wczytujesz po 5 znaków z pliku to kolejne obroty pętli wczytują

Kopiuj
"To je"  -> bufor = ['T', 'o', ' ', 'j', 'e', '\0']
"st te"  -> bufor = ['s', 't', ' ', 't', 'e', '\0']
"kst"    -> bufor = ['k', 's', 't', 't', 'e', '\0']  // dwa ostatnie znaki przed nullem zostają z poprzedniego czytania

Sprawdzaj po każdym wczytaniu ile faktycznie zostało wczytanych bajtów i jeśli ta wartość jest mniejsza niż rozmiar bufora to wstawiaj w to miejsce '\0'.


"I love C++. It's the best language in the world right now for me to write the code that i need and want to write"
~ Herb Sutter
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 13 godzin
1
tajny_agent napisał(a):

Sprawdzaj po każdym wczytaniu ile faktycznie zostało wczytanych bajtów i jeśli ta wartość jest mniejsza niż rozmiar bufora to wstawiaj w to miejsce '\0'.

Czy nie prościej po każdym wczytaniu wstawiać zero po ostatnim wczytanym znaku (bez sprawdzań)?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
rajszym
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad rok
  • Postów:62
0

@Songos: Zastanów się, co chcesz osiągnąć.
Jeżeli czytasz plik w trybie binarnym, to po co chcesz wyświetlać to na ekranie?
Należy raczej wykorzystać do tego tryb tekstowy oraz np. funkcję getline.

SO
Jest mi to potrzebne do projektu, który wykorzystuje operacje XOR. I tak pomału uczę się robić rzeczy, które muszę wykorzystać w projekcie.
SO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:19
0
Kopiuj
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

int main()
{
ifstream plik("tekst.txt", ios::binary);
const int M=5;
char tresc[M+1];

    if(!plik)
        {   cout<<"Plik nie istnieje.";
            return 0;
        }
    while(plik)
    {

        plik.read(tresc,M);
        int len=0;
        len=plik.gcount();
        if(len<M)
            {
                tresc[len]='\0';
            }
        //cout<<tresc<<setw(5)<<endl;
        for(int i=0;i<M;i++)
        {
            if(tresc[i]==0)
                break;
            cout<<tresc[i]<<endl;
        }
    }
plik.close();
	return 0;
}

A czy teraz ten kod jest w miarę okej ?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 13 godzin
0
Kopiuj
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream plik("tekst.txt", ios::binary);
    const int MaxPartSize=5;
    char tresc[MaxPartSize+1];
    
    if(!plik) exit(cout<<"Plik nie istnieje.")
    while(plik)
    {
        plik.read(tresc,MaxPartSize);
        int len=plik.gcount();
        tresc[len]=0;
        cout<<tresc[i];
    }
    plik.close();
    return 0;
}

lub:

Kopiuj
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream plik("tekst.txt", ios::binary);
    const int MaxPartSize=5;
    char tresc[MaxPartSize];
    
    if(!plik) exit(cout<<"Plik nie istnieje.")
    while(plik)
    {
        plik.read(tresc,MaxPartSize);
        int len=plik.gcount();
        for(int i=0;i<len;++i) cout<<tresc[i]<<endl;
    }
    plik.close();
    return 0;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
SO
Dziękuję bardzo :) A 11 linijka jest w porządku ? Bo program mi się nie kompiluje, ale to akurat naprawiłem :D
_13th_Dragon
pisałem "na kolanie" średnik mi wcięło.
SO
Spoko, dzięki jeszcze raz :)
SO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:19
0

Mam kolejny podobny problem, więc nie będę zakładał nowego wątku.

Kopiuj
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
char text[10];
ifstream plik("wizytowka.txt", ios::binary);
char result[10];
int licznik=0;
char wynik[1];

    if(!plik)
        {
            cout<<"Plik nie istnieje.";
            return 0;
        }
    wynik[0]=0xAA;
    plik.read(result,1);
    cout<<"'"<<result[0]<<"' XOR "<<hex<<showbase<<static_cast<int>(wynik[0]);
    cout<<" XOR "<<dec<<licznik<<" = "<<hex<<static_cast<int>(result[0])<<endl;



plik.close();

return 0;
    }

W pliku mam "o" i wynik jaki uzyskuje, to: " 'o' XOR 0xffffffaa XOR 0 = 0x6f" dlaczego 0xaa zapisuje mi się jako 0xffffffaa a nie jako 0xaa i w jaki sposób mogę to naprawić ?

rajszym
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad rok
  • Postów:62
0
Songos napisał(a):

W pliku mam "o" i wynik jaki uzyskuje, to: " 'o' XOR 0xffffffaa XOR 0 = 0x6f" dlaczego 0xaa zapisuje mi się jako 0xffffffaa a nie jako 0xaa i w jaki sposób mogę to naprawić ?

Liczbę ze znakiem (char) konwertujesz do int.

SO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:19
0

@rajszym: A w jaki sposób mogę to zmienić, żeby było dobrze ? Jeżeli napiszę cout<<"'"<<result[0]<<"' XOR "<<hex<<showbase<<static_cast<char>(wynik[0]); to wtedy wyświetla mi się jakiś krzak a nie liczba.

rajszym
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad rok
  • Postów:62
0
Kopiuj
unsigned char wynik[1];
Kopiuj
static_cast<unsigned int>(wynik[0])
SO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:19
0

@rajszym: A jeśli chcę wynik[1] zapisać do pliku za pomocą funkcji write() to twoim zdaniem będzie okej, jeśli utworzę nową zmienną char, dam jej wartość wynik[1] i wtedy tę nową zmienną char zapiszę do pliku za pomocą funkcji write ? Bo jak próbuję zapisać do plik zmienną wynik[1] która jest typu unsigned char to wyskakuje mi błąd

rajszym
  • Rejestracja:prawie 6 lat
  • Ostatnio:ponad rok
  • Postów:62
0
Kopiuj
char wynik[1];
Kopiuj
cout<<"'"<<result[0]<<"' XOR "<<hex<<showbase<<(wynik[0]&0xff);

Jeszcze raz wrócę do tego, co napisałem poprzednio:

rajszym napisał(a):

@Songos: Zastanów się, co chcesz osiągnąć.

Napisz, jaki ma być ostateczny cel Twoich zmagań.
Zastanów się nad strukturą programu.
Podziel problem na mniejsze (wyodrębnij funkcje) .
Jak na razie, to masz jeden wielki problem XY.

edytowany 2x, ostatnio: rajszym
SO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:19
0

Dzięki za pomoc. Ogólnie chcę zrobić szyfrowanie i deszyfrowanie pliku za pomocą operacji XOR, ale utworzyłem nową zmienną char i dałem jej wartość wynik[1] i chyba program dobrze działa.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 13 godzin
0

to po kiego ładujesz do pamięci?
int kolejnyZnak=plik.get();
if(kolejnyZnak==EOF) // koniec pliku
int zmienionyZnak='\x00'; plikWynikowy.put(zmienionyZnak);


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
SO
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:19
0

Ładuję do pamięci, żeby w następnej funkcji zrobić deszyfrowanie z tego pliku. Mogę to jakoś prościej zrobić ?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.