Czasami zdarza się, że człowiek nie ma aktualnie potrzebnego narzędzia. Pobieranie z neta jest albo niemożliwe, albo zajmie zbyt dużo czasu, a człowiek chce plikowi w bebechy zajrzeć. No i poczułam coś takiego i klepnęłam taki kawałek kodu (thx widmo za podpowiedź co do zmiany define na wartość predefiniowaną)
#include <iostream> #include <fstream> #include <cstring> #include <cstdlib> /** * --==LOOKACZ==-- by Angelika Maria Piątkowska aka piatkosia * kontakt: piatkosia.apt@interia.pl * Program wyświetla zawartość dowolnego pliku binarnego. Na razie bez możliwości edycji. * Wywołanie: nazwa_programu plik_do_odczytu * W przypadku błędnego wyświetlania treści dokumentu proszę ustawić czcionkę Lucida console. * W przypadku linuxa może się okazać konieczne użycie iconv do źródła w celu zmiany kodowania. * Kody błędów: * 0: Program wykonany poprawnie * 1: Nieprawidłowa ilość parametrów. * 2: Błąd otwarcia pliku. Prawdopodobnie plik nie istnieje, lub użytkownik nie ma do niego dostępu. * Pojawiające się co jakiś czas xx to była wartość ffff która na pewno nie była charem, także jakiś inny znak, niż ten, który mógłbyć typu char. * sprawdzenie kodu błędów: * systemy POSIX/LINUX: echo $? * systemy DOS/WINDOWS: echo %errorlevel% **/ inline void setwinda(){ #ifdef _WIN32 system("chcp 1250>NUL"); #endif } inline void unsetwinda(){ #ifdef _WIN32 system("chcp 852>NUL"); #endif } using namespace std; //Program jest krótki, więc nie będę go jakoś rozbijać specjalnie int main(int argc, char* argv[]){ setwinda(); if (argc ==2 && (string)argv[1]=="--help"){ cout<<" --==LOOKACZ==--\n"; cout<<"Program wyświetla co jest w pliku w formacie hex i ascii. I nic więcej\n"; cout<<"Użycie\n"; cout<<argv[0]<<" <plik wejściowy>\n"; unsetwinda(); return 0; //przecież program wykonał się poprawnie } if (argc == 1){ cout<<"Czegoś chyba zapomniałeś\n Nie wiesz czego?\n sprawdź używając "<<argv[0]<<" --help"; unsetwinda(); return 1; //Niepoprawna ilość parametrów } if (argc > 2){ cout<<"Nie rozpędzasz się przypadkiem? \n"; cout<<"Sprawdź: "<<argv[0]<<" --help\n"; unsetwinda(); return 1; //niepoprawna ilość argumentów } //No dobra, Jesteśmy pewni, że nikt nie podał tego, czego nie trzeba:) ifstream plik; /// Zmienna plikowa klasy ifstream plik.open(argv[1], ios::in|ios::binary); if (!plik.good()){ cerr<<"\nBłąd otwarcia pliku"; unsetwinda(); return 2; //Błąd otwarcia pliku } char bufor[16] = {}; ///Tablica do przechowywania danych, na których będziemy operować. int waiter = 1; /// Zmienna którą wykorzystamy do przerywania pracy po 20 linijkach wczytanych danych cout<<"------------------Wartość hex ------------------ | -Wartość ascii -"<<endl; while (!plik.eof()){ plik.read(bufor, 16); //Wypisanie danych w postaci hexowej for (int i = 0; i<16; i++){ cout.width(2); cout.fill('0'); if (((unsigned int)bufor[i]) > 0xff ) cout<<"xx "; else cout<<hex<<(unsigned int)bufor[i]<<" "; //Nie nieee, żadnego końca linii nie będzie } cout<<" | "; for (int i = 0; i<16; i++){ if ((bufor[i])<32) cout<<'.'; else cout<<bufor[i]; } cout<<endl; memset(bufor, 0, 16); //czyszczenie bufora; //żeby ekran nie uciekał if ((waiter % 20) == 0){ char a; ///całość by mieć nieco podgląd na plik cout<<"--Aby kontynuować naciśnij enter |"; cin.get(a); } waiter++; } plik.close(); unsetwinda(); return 0; }