Program wyświetlający plik tekstowo i szesnastkowo.

0

Witam!
Mam do zrealizowania program wyświetlający plik szesnastkowo oraz tekstowo, tylko nie mam pojęcia jak się do tego zabrać.
Przetwarzając muszę przyjąć, że rozmiar pliku jest dużo większy niż dostępna pamięć operacyjna.

int main()
{	
fstream plik;
plik.open("plik.txt", ios::in);
if(plik.good()==false)
{
cerr<<"Plik nie istnieje";
exit(0);
}

cout<<"Tekstowo:"<<endl;
cout<<"Szesnastkowo:"<<endl;
plik.close();
return 0;	
}
2

Czytasz kolejne 256 bajtów do bufora i odpowiednio je wyświetlasz.
Po naciśnięciu czegoś - kolejne 256 bajtów.

0

Czyli najprościej będzie użyć funkcji read.

0
MrStupdi69 napisał(a):

Czyli najprościej będzie użyć funkcji read.
Albo ty nie zrozumiałeś zadania albo ja. To co dopisałeś w poście po mojej odpowiedzi ewidentnie na to wskazuje.
Może zdobądź jakiś przykład wyświetlenia.

0

Jakie hasła wpisywałeś w Google, aby odnaleźć rozwiązanie?
Bo jakoś c++ display hex zwraca odpowiednie materiały, więc musiałbyś chyba szukać c++ niebieskie krasnoludki, aby nie trafić na odpowiednie tematy.

0

Z tego wynika że to ja dobrze zrozumiałem. Więc wiersze:

cout<<"Tekstowo:"<<endl;
cout<<"Szesnastkowo:"<<endl;

należy wywalić.

0
  1. Nie nadużywaj inkrementacji przyrostkowej, for(int i=0;i<max;++i) zadziała identycznie, ale: http://4programmers.net/Forum/1101404
  2. 256 razy chcesz wywołać: plik.gcount(), WTF?
  3. cout<<hex<<(int)bufor[i];
0

Coś takiego przyszło mi do głowy:

#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;

void print(char* buffer, int size) {
	for (int i = 0; i < size; ++i)
		cout << hex << setw(4) << static_cast<int>(buffer[i]) << "  ";

	for (int i = 0; i < size; ++i)
		if(buffer[i] != '\n') cout << buffer[i];
	cout << endl;
}

int countBytes(fstream& file) {
	file.seekg(0, file.end);
	int bytes = static_cast<int>(file.tellg());
	file.seekg(0, file.beg);
	return bytes;
}

void hexRead(const char* path) {
	fstream file(path, ios::in | ios::binary);
	if (file.is_open()) {
		int length = 8;
		char* buffer = new char[length];
		
		int steps = countBytes(file) / length;
		int last = countBytes(file) % length;

		for (int i = 0; i < steps; ++i) {
			file.read((char*)buffer, length * sizeof(char));
			print(buffer, length);
		}

		file.read((char*)buffer, last * sizeof(char));
		print(buffer, last);

		delete[] buffer;
		file.close();
	}
}

int main() {
	hexRead("test.txt");
	return 0;
}

Przykładowy wynik:

  47    72    7a    65    73    69    65    6b  Grzesiek
  20    54    6f    6d    65    6b     d     a   Tomek
  52    79    73    69    65    6b     d     a  Rysiek
  4d    61    63    69    65    6b    54    6f  MaciekTo
  6d    65    6b  mek

1 użytkowników online, w tym zalogowanych: 0, gości: 1