Plik binarny #binarny

0

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

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.

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 ?

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"

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ą

"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'.

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ń)?

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.

0
#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 ?

0
#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:

#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;
}
0

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

#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ć ?

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.

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.

0
unsigned char wynik[1];
static_cast<unsigned int>(wynik[0])
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

0
char wynik[1];
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.

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.

0

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

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1