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ą)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #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; } |