Cześć. Co oznacza "0Řa", mógłby ktoś wytłumaczyć ?
- c++.png (25 KB) - ściągnięć: 101
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.
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 ?
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'.
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ń)?
@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.
#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 ?
#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;
}
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ć ?
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.
@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
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.
to po kiego ładujesz do pamięci?
int kolejnyZnak=plik.get();
if(kolejnyZnak==EOF) // koniec pliku
int zmienionyZnak='\x00'; plikWynikowy.put(zmienionyZnak);