Przepisywanie kodu na czysty C

0

Witam, potrzebuję przepisać ten kod na czysty C. Jednak nie bardzo wiem jak to zrobić. Wydaje mi się, że muszę przepisać klasy na struktury, proszę o wskazówki i pomoc. Program pochodzi ze strony algorytmów i ma za zadanie ukrywać tekst w pliku bmp.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

//!Klasa sluzaca do konwersji liczb i manipulacji na najmlodszym bicie
class Bajt{
public:

	int  Wartosc;
	char Bity[100];

//!Ile bitow ma liczba
	int LiczbaBitow;

//!Zamiana atrybutu na wartosci binarne
void Binarnie(void){

	int W;
	int l=0;
	W=Wartosc;

	do{
		if ((W % 2) == 0)
			Bity[LiczbaBitow-l-1]='0';
		else
			Bity[LiczbaBitow-l-1]='1';
		W/=2;
		l++;
	}while (l!=LiczbaBitow);
}

//!Zamiana wartosci atrybutu na system dziesietny
void Dziesietnie(void){

	unsigned long val = 1;
	Wartosc=0;

	for (int l=0;l<LiczbaBitow;l++)
	{
		if (Bity[LiczbaBitow-l-1]=='1')
			Wartosc+= val;
		val *= 2;
	}

	return;
}

//!Utworzenie 32-bitowej liczby z bajtow a,b,c i d
void Zamien(Bajt a,Bajt b, Bajt c, Bajt d){

	a.Binarnie();
	b.Binarnie();
	c.Binarnie();
	d.Binarnie();

	for (int i=0;i<8;i++)
		Bity[i]=d.Bity[i];

	for (int i=0;i<8;i++)
		Bity[i+8]=c.Bity[i];

	for (int i=0;i<8;i++)
		Bity[i+16]=b.Bity[i];

	for (int i=0;i<8;i++)
		Bity[i+24]=a.Bity[i];

return;
}

//!Ustawia wartosci najmniej znaczacego bitu na i (0 lub 1)
void UstawBit(char i){

	Binarnie();
	Bity[LiczbaBitow-1]=i;

return;
}


//!Konstruktor (n-liczba bitów na liczbe)
Bajt(int n){
	LiczbaBitow=n;
}

};//!Koniec klasy



//!Klasa opisujaca obrazek
class BitMapa{

public:

//!Plik wejsciowy
	FILE *Plik;

//!Plik z tekstem do ukrycia
	FILE *Tekst;

//!Offset danych
	int AdresDanych;

//!Liczba bajtów opisujacych dane
	int RozmiarDanych;

//!Szerokosc obrazka w pikselach
	int Szerokosc;

//Liczba bajtów tekstu
	int RozmiarTekstu;

/*!Metoda wczytujaca adres danych, liczbe bitów kolorów, i szerokosc
*/
int WczytajPlik(char NazwaPliku[50]){

	int Znak;

//!Otwórz plik z bitmap¹ (w trybie binarnym)
	Plik=fopen(NazwaPliku,"rb");
	if (Plik==NULL)
		return(0);

//!Przejdz do 10 bajtu i odczytaj adres obszaru danych (4 bajty
	fseek(Plik,10,SEEK_SET);

//Utworz 4 jednobajtowe liczby
	Bajt *word1=new Bajt(8);
	Bajt *word2=new Bajt(8);
	Bajt *word3=new Bajt(8);
	Bajt *word4=new Bajt(8);

//!Wczytuj 4 kolejne bajty
	Znak=getc(Plik);
	word1->Wartosc=Znak;
	Znak=getc(Plik);
	word2->Wartosc=Znak;
	Znak=getc(Plik);
	word3->Wartosc=Znak;
	Znak=getc(Plik);
	word4->Wartosc=Znak;

//!Utworz 32-bitowa liczbe z powzszych bajtów
	Bajt *Dane=new Bajt(32);
	Dane->Zamien(*word1,*word2,*word3,*word4);
	Dane->Dziesietnie();

//!Przypisz otrzymana wartosc zmiennej adresu danych
	AdresDanych=Dane->Wartosc;

//!Przejdz do 18 bajtu i odczytaj szerokosc
	fseek(Plik,18,SEEK_SET);

	Znak=getc(Plik);
	word1->Wartosc=Znak;
	Znak=getc(Plik);
	word2->Wartosc=Znak;
	Znak=getc(Plik);
	word3->Wartosc=Znak;
	Znak=getc(Plik);
	word4->Wartosc=Znak;

	Dane->Zamien(*word1,*word2,*word3,*word4);
	Dane->Dziesietnie();

//!Zapamietaj wartosc w atrybucie
	Szerokosc=Dane->Wartosc;


//!Przejdz do 34 bajtu i odczytaj dlugosc obszaru danych (4 bajty)
	fseek(Plik,34,SEEK_SET);

	Znak=getc(Plik);
	word1->Wartosc=Znak;
	Znak=getc(Plik);
	word2->Wartosc=Znak;
	Znak=getc(Plik);
	word3->Wartosc=Znak;
	Znak=getc(Plik);
	word4->Wartosc=Znak;

//!Utworz 32-bitowa liczbe
	Dane->Zamien(*word1,*word2,*word3,*word4);
	Dane->Dziesietnie();

//!Zapamietaj rozmiar danych
	RozmiarDanych=Dane->Wartosc;


//!Usun niepotrzebne juz obiekty
	delete word1;
	delete word2;
	delete word3;
	delete word4;
	delete Dane;

return(1);
} //!Koniec metody


//!Destruktor zamyka otwarte pliki
~BitMapa(void){
	fclose(Plik);
	fclose(Tekst);
}


//!Metoda odczytuje z bitmapy tekst i drukuje go na ekranie
void Wypisz(char PlikTekstowy[10]){

	int k=0;
	int Znak;
	int Przeczytane=0;

//!Otwórz plik z tekstem (w trybie tekstowym)
	Tekst=fopen(PlikTekstowy,"wt+");

/*!Na koncu linii znajduja sie zera nieznaczace. Moze ich byc 0, 1, 2 lub 3
jest to reszta z dzielenia szerokoœci przez 4
*/
	int ZeraNieznaczace = Szerokosc % 4;

//!Na koncu tekstu znajduje sie ciag 8 wyzerowanych bitów
	int Koniec=0;

	Bajt *bajtZnaku=new Bajt(8);
	Bajt *bajtTMP=new Bajt(8);
	int licznikBitow=0;

	fseek(Plik,AdresDanych,SEEK_SET);

	while (k!=RozmiarDanych){
		Znak=getc(Plik);
		Przeczytane++;
		if (Przeczytane<=Szerokosc)
			{
			bajtZnaku->Wartosc=Znak;
			bajtZnaku->Binarnie();
			bajtTMP->Bity[licznikBitow]=bajtZnaku->Bity[7];
			licznikBitow++;

			if (licznikBitow==8)
				{
				licznikBitow=0;
				bajtTMP->Dziesietnie();

//!Jezli znalazles bajt 0 (ciag 8 wyzerowanych bitów) to jest to koniec ukrytego tekstu
			if (bajtTMP->Wartosc==0) Koniec=1;

			if (Koniec==0)
				fprintf(Tekst,"%c",bajtTMP->Wartosc);
			}
		}

	if (Przeczytane==Szerokosc+ZeraNieznaczace)
		Przeczytane=0;
	k++;
}

//!Usun obiekty
	delete bajtZnaku;
	delete bajtTMP;

return;
}


//!Metoda tworzy bitmape z ukrytym tekstem
int Kopiuj(char NowaBitmapa[10],char PlikTekstowy[10]){

//!Bitmapa z ukrytym tekstem
	FILE *DrugiPlik;
	int znak;
	int Koniec=0;
	int k=0;
	int Znak;
	int Przeczytane=0;
	int BitZnaku=0;
	int ZnakTekstu;

//!Zera nieznaczace, jak wyzej
	int ZeraNieznaczace= Szerokosc % 4;

	Bajt *bajt=new Bajt(8);
	Bajt *bajtZnaku=new Bajt(8);

//!Otwórz plik z tekstem (w trybie tekstowym)
	Tekst=fopen(PlikTekstowy,"rt+");

//!Odczytaj jego rozmiar i wróc na poczatek pliku
	RozmiarTekstu=fseek(Tekst,0L,SEEK_END);
	RozmiarTekstu = ftell(Tekst);
	fseek(Tekst,0L,SEEK_SET);

//!Czy wystarczy pikseli do ukrycia tekstu?
	if ((RozmiarTekstu+1)*8>RozmiarDanych)
		return(0);

//!Utwórz druga bitmape w trybie binarnym do zapisu
	DrugiPlik=fopen(NowaBitmapa,"wb");

//!Wróc na poczatek pierwszej bitmapy
	fseek(Plik,0L,SEEK_SET);

/*!Przepisz naglówek oryginalnej bitmapy (az do obszaru danych)
niczego nie zmieniajac
*/
	do {
		znak=getc(Plik);
		if (k<AdresDanych)
		putc(znak,DrugiPlik);
		k++;
	} while (k<AdresDanych);

/*!Przepisuj kolejne bajty obszaru danych zmieniajac ostatni
bit kazdego koloru
*/
	k=0;
	while (k!=RozmiarDanych){

		if ((BitZnaku==0))
			{

			if (Przeczytane<Szerokosc)
				ZnakTekstu=getc(Tekst);

/*!Jezeli skonczyl sie plik z tekstem, wstaw do drugiej bitmapy
8 bajtów z wyzerowanym ostatnim bitem (znacznik konca tekstu)
*/

		if (ZnakTekstu==-1)
			{
//!Znacznik konca tekstu
			bajtZnaku->Wartosc=0;
			bajtZnaku->Binarnie();
			}

//!Jezeli tekst sie jeszcze nie skonczyl, pobierz nastepny bajt
		else{
			bajtZnaku->Wartosc=ZnakTekstu;
			bajtZnaku->Binarnie();
		}
	}

//!Pobierz bajt z oryginalnej bitmapy
	znak=getc(Plik);
	Przeczytane++;

//!Jezeli nie wkroczyles w obszar zer nieznaczzcych i tekst sie jeszcze nie skonczyl
if ((Przeczytane<=Szerokosc)&&Koniec==0)
		{
		bajt->Wartosc=znak;
		bajt->Binarnie();

//!Zmien ostatni bit na kolejnt bit bajtu tekstu
		bajt->UstawBit(bajtZnaku->Bity[BitZnaku]);
		BitZnaku++;

		if (BitZnaku==8)
			{
			BitZnaku=0;
			if (bajtZnaku->Wartosc==0)
			Koniec=1;
			}
		bajt->Dziesietnie();

//!Zapisz zmodyfikowany bajt do nowej bitmapy
		znak=bajt->Wartosc;
		putc(znak,DrugiPlik);
		} else

/*!Jezeli tekst sie juz skonczyl lub wkroczyles w obszar zer nieznaczacych
to przepisz bajt nie zmieniajac go
*/
		putc(znak,DrugiPlik);

		if (Przeczytane==Szerokosc+ZeraNieznaczace)
			Przeczytane=0;

		k++;
	}


//!Usun obiekty i zamknij zmodyfikowana bitmape
	delete bajt;
	delete bajtZnaku
	fclose(DrugiPlik);

return 1;
}

}; //!Koniec klasy


//-----------------------------------------------

int main(void){

	BitMapa BMP;
	int opcja;
	char BMP1[100];
	char BMP2[100];
	char TXT[100];

	printf("Wybierz opcje\n");
	printf("1- Ukrycie pliku\n2- Odzyskanie pliku\n3 - Koniec\n");

	do
		scanf("%d",&opcja);
	while ((opcja!=1)&&(opcja!=2)&&(opcja!=3));

	if (opcja==3) return 0;

	if (opcja==1){
		printf("Nazwa pliku z wejsciowym obrazem: ");
		scanf("%s",BMP1);
		printf("Nazwa pliku z wejsciowym tekstem: ");
		scanf("%s",TXT);
		printf("Nazwa pliku z wyjsciowym obrazem: ");
		scanf("%s",BMP2);

		if (BMP.WczytajPlik(BMP1)==0){
			printf("Plik %s nie istnieje\n",BMP1);
			getch();
			exit(0);
			}

		if (BMP.Kopiuj(BMP2,TXT)==0)
			{
			printf("Plik z obrazkiem jest zbyt maly, zeby ukryc tekst\n");
			getch();
			exit(0);
			} else printf("Plik zostal ukryty...\n");
		}else

		{
		printf("Nazwa pliku z wejsciowym obrazem: ");
		scanf("%s",BMP1);
		printf("Nazwa pliku z wyjsciowym tekstem: ");
		scanf("%s",TXT);
		if (BMP.WczytajPlik(BMP1)==0){
			printf("Plik %s nie istnieje\n",BMP1);
			getch();
			exit(0);
		}
		BMP.Wypisz(TXT);
		printf("Plik zostal odzyskany...\n");

	}
printf("\nDowolny klawisz...\n");
getch();
return 0;
}
0

W C przecież nie ma obiektów, musiałbyś zmienić całkowicie logikę programu.

0

Ale są struktury (chyba) więc trzeba pozbyć się funkcji wewnątrz obiektów, przerobić je na "wolne" funkcje i klasy przerobić na struktury, po takich operacjach funkcja main wyglądała by jakoś tak:

int main(void)
{
    BitMapa BMP;
    int opcja;
    char BMP1[100];
    char BMP2[100];
    char TXT[100];

    printf("Wybierz opcje\n");
    printf("1- Ukrycie pliku\n2- Odzyskanie pliku\n3 - Koniec\n");

    do
        scanf("%d",&opcja);
    while ((opcja!=1)&&(opcja!=2)&&(opcja!=3));

    if (opcja==3) return 0;

    if (opcja==1)
    {
        printf("Nazwa pliku z wejsciowym obrazem: ");
        scanf("%s",BMP1);
        printf("Nazwa pliku z wejsciowym tekstem: ");
        scanf("%s",TXT);
        printf("Nazwa pliku z wyjsciowym obrazem: ");
        scanf("%s",BMP2);

        if (WczytajPlik(BMP, BMP1) == 0)  // funkcja WczytajPlik nie jest teraz składową BMP więc przyjmuje dwa argumenty
        {
            printf("Plik %s nie istnieje\n",BMP1);
            getch();
            exit(0);
        }

        if (Kopiuj(BMP, BMP2, TXT) == 0)
        {
            printf("Plik z obrazkiem jest zbyt maly, zeby ukryc tekst\n");
            getch();
            exit(0);
        } 
        else printf("Plik zostal ukryty...\n");
    }
    else
    {
        printf("Nazwa pliku z wejsciowym obrazem: ");
        scanf("%s",BMP1);
        printf("Nazwa pliku z wyjsciowym tekstem: ");
        scanf("%s",TXT);
        if (WczytajPlik(BMP, BMP1) == 0)
        {
            printf("Plik %s nie istnieje\n", BMP1);
            getch();
            exit(0);
        }
        Wypisz(BMP, TXT);
        printf("Plik zostal odzyskany...\n");
    }

    printf("\nDowolny klawisz...\n");
    getch();
    return 0;
}

Mniej więcej, ale to musisz pokombinować.

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