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