[C++] Długość nieparzysta pliku

Witam,

mam napisany kod algorytmu Hilla. Wszystko działa pięknie, tylko problem jest z długością nieparzystą pliku. Po rozkodowaniu słowa np. informatyka jest dodatkowy znak, którego nie powinno być.

A dokładnie - mamy słowo informatyka --> kodujemy to słowo —> $÷!ň3&÷;Ç# —> rozkodujemy zakodowane słowo —> informatyka˙

Jak widzimy, mamy dodatkowy znak “˙”.

Tak szczerze nie miałem z tym do czynienia, więc nie wiem, jaki kod napisać.

Jak to w ogóle wygląda? Potrzebny będzie do tego char?

Hmmm… jak wczytujesz plik?

Jak wczytujesz cały plik (albo po kawałku) do bufora to możesz najpierw sprawdzić długość pliku i w zależności od parzystości wpisać odpowiednie bajty na początek bufora a do reszty wczytać plik.

Pseudolosowe liczby możesz uzyskać funkcją rand().

Tak wczytuję plik:

int main() {


	char plik_wejsciowy[255];

	char plik_wyjsciowy[255];


	cout << "Podaj nazwe pliku wejsciowego: " << endl;

	cin >> plik_wejsciowy;

	cout << endl << "Podaj nazwe pliku wynikowego: " << endl;

	cin >> plik_wyjsciowy;

	ifstream input(plik_wejsciowy);

	ofstream output(plik_wyjsciowy);

}

Hmm…, tylko jak napisać kod, żeby bity zostały dodawane? Polecisz jakąś fajną stronę.

Nie miałem z tym do czynienia, więc z głowy nie napiszę kodu :slight_smile:

Nie widzę abyś wczytywał plik, jedynie je otwierasz :wink:

Jest to dosyć prosta rzecz, można to zrobić na wiele sposobów. Przykład z wczytywaniem całego pliku do bufora

#include 

#include 

#include 

#include 

using namespace std;


int main()

{

	ifstream in("file.txt");


	in.seekg(0, ios::end); //ustawienie wskaźnikia pliku na koniec

	int size = in.tellg(); //pobranie pozycji wskaźnika pliku, ponieważ wskaźnik znajduje się teraz na końcu, więc jest to jednocześnie rozmiar pliku

	in.seekg(0, ios::beg); //ustawienie wskaźnika pliku z powrotem na początek pliku


	uint8_t* buff; //wskaźnik na bufor; uint8_t to liczba całkowita o rozmiarze 8 bitów (1 bajta), bez znaku, <0-255>


	srand((unsigned)time(0)); //ustawienie początkowego ziarna generatora pseudolosowego na aktualny czas


	if(size % 2 == 0) //jeśli rozmiar jest parzysty

	{

		size += 2; //nowy rozmiar jest większy o 2

		buff = new uint8_t[size]; //alokacja bufora

		buff[0] = 128 + rand() % 128; //wypełnienie pierwszych dwóch bajtów

		buff[1] = rand() % 128;

		in.read((char*)buff + 2, size - 2); //wczytanie pliku do reszty bufora

	}

	else //jeśli rozmiar jest nieparzysty

	{

		size += 1;

		buff = new uint8_t[size];

		buff[0] = rand() % 128;

		in.read((char*)buff + 1, size - 1);

	}


	in.close();


	// Dane są w buforze wskazywanym przez zmienną `buff` a rozmiar danych (łącznie z dopełnieniem) jest w zmiennej `size`.

	// Możesz robić co chesz z tymi danymi, np. zapisać do pliku

	ofstream out("file2.txt");

	out.write((char*)buff, size);

	out.close();


	delete[] buff; //na koniec dobrze po sobie posprzątać ;)


	return 0;

}

Jeśli mam coś polecić, to zerknij na to:

:smiley: