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:3 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:3 miesiące
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:ponad 5 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:3 miesiące
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:ponad 5 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:ponad 5 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:ponad 5 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:3 miesiące
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ć ?

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)