Skocz do zawartości
arahjakult

Program Kompresja Plików Bianrbych Problem

Rekomendowane odpowiedzi

hej mam problem z programem. problem polega na tym ze w pliku docelowym gdy wrzuce ciag znakow np : "dfs sdfsd " to kolejne wrzucenie znakow nie wrzuca go na koniec czyli za tymi spacjami po" sdfsd" tylko od razu

oto kod:

#include <iostream>

#include <string>

#include <vector>

#include <conio.h>

#include <fstream>

#include <stdlib.h>

#include <stdio.h>

//////////////////////////////////////////////////////

using namespace std;

//////////////////////////////////////////////////////

 

/*

funkcja tworzaca tablice pocztkowa znakow ktore

moga wystapic w pliku binarnym na podstawie tablicy ASCII,

do tej tablicy nastepnie dodawane beda kolejne pola

*/

vector <string> tworztab(){

 

vector <string> tab(256);

vector<string> :: iterator iter = tab.begin();

//petla przydzielajaca wektorowi wartosci tablicy ASCII

for(int x=0;x<256;x++,++iter) *iter = char(x);

return tab;

}

 

//funkcja pomocnicza

void wypisz(vector<string> tab){

int y=0;

vector<string> :: iterator iter = tab.begin();//iterator

for(iter=tab.begin();iter<tab.end();++iter,++y) cout<<y << *iter <<endl;

}

 

// Podawanie nazw plikow przy kompresji

const char *podajwej_k(){

string nazwa;

cout << endl <<"Podaj nazwe pliku do kompresji: " ;

cin >> nazwa;

return nazwa.c_str();

}

const char *podajwyj_k(){

string nazwa;

cout <<endl << "Podaj nazwe pliku wyjsciowego po kompresji: " ;

cin >> nazwa;

nazwa=nazwa+".cmp";

return nazwa.c_str();

}

/*

Podawanie nazw plikow przy dekompresji

UWAGA podawanie nazw pliku do dekompresji zostawilem, poniewaz

mzoe sie przydac przy pzoniejszej modyfikacji programu

*/

const char *podajwej_d(){

string nazwa;

cout <<endl << "Podaj nazwe pliku do dekompresji: " ;

cin >> nazwa;

return nazwa.c_str();

}

const char *podajwyj_d(){

string nazwa;

cout <<endl << "Podaj nazwe pliku wyjsciowego po dekompresji: " ;

cin >> nazwa;

return nazwa.c_str();

}

 

/*

funkcja kompresujaca

*/

vector<string> komp(){

 

 

FILE *wej; // plik wej

 

string s,help;

int zn=0,skok=0;

unsigned int znak;

 

int li=0,temp=0,index=-1;

vector <string> tab; //wektor tablicy wzorcowej

vector<string> :: iterator iter = tab.begin();//iterator

 

do{wej = fopen(podajwej_k(),"rb"); //otwarcie pliku do odczytania zawartosci

}while(wej==NULL);

 

ofstream out(podajwyj_k());

 

s=char(getc(wej));

 

do{

// cout << " ROZMIAR TABLICY: " << tab.size() << endl;

znak=getc(wej) ;

 

li=0;

zn=0;

for(iter=tab.begin();iter<tab.end();++iter){

if((s+char(znak))==*iter) {

index=li;

zn=1;

// cout << "!!znaleziono w tablicy!!" << s+char(znak) << endl;

break;

}

li++;

}

 

if(zn==1){

 

 

s=s+char(znak);

temp=1;

 

}else{

 

if(temp==1){

help=index;

tab.push_back(s+char(znak));

if((help.size()+2)<(s+char(znak)).size()){

out << noskipws;

out << "<" << index << ">";

 

// cout << " Zapisano: "<< tab[index]<<endl;

}else {

out << noskipws;

out << s.c_str();

 

}

li=0;

temp=0;

 

s=char(znak);

}else{

tab.push_back(s+char(znak));

out << noskipws;

out << s.c_str();

 

s=char(znak);

}

}

 

 

 

}while(znak!=((unsigned)EOF));

 

fclose(wej);

 

cout << endl << "## Kompresja udana! ##" << endl << "Nacisnij jakis klawisz..." ;

 

// wypisz(tab);

 

getch();

return tab;

}

 

vector<string> dekomp(vector<string> tab){

 

 

if(tab.empty()){

cout << "Tablica wzorow pusta! Musisz skompresowac jakis plik! Nacisnij jakis klawisz...";

getch();

}else{

FILE *wej; // plik wej

unsigned int znak,znak2;

int i,y=0;

string s;

 

vector<string> :: iterator iter = tab.begin();//iterator

 

 

do{wej = fopen(podajwej_d(),"rb"); //otwarcie pliku do odczytania zawartosci

}while(wej==NULL);

 

ofstream out(podajwyj_d());

 

 

while((znak=fgetc(wej))!=EOF){

 

if(znak==int('<')){

 

do{

znak2=fgetc(wej);

if(char(znak)=='>') break;

s=s+char(znak2);

}while(znak2!=int('>'));

 

out << noskipws;

out << tab[atoi(s.c_str())].c_str();

 

s="";

 

}else{

out << noskipws;

out << char(znak);

 

}

};

 

fclose(wej);

 

cout << endl << "## Dekompresja udana! ##" << endl << "Nacisnij jakis klawisz..." ;

 

// wypisz(tab);

 

getch();

};

return tab;

}

 

void autor(){

system("cls");

cout << " /////////////////////////////////////////////////////////////////// " << endl;

cout << " // Wykonanie: // " << endl;

cout << " // // " << endl;

cout << " /////////////////////////////////////////////////////////////////// " << endl;

 

}

 

 

 

//////////////////////// CZESC GLOWNA //////////////////////////////

int main(){

 

vector <string> tab; //wektor tablicy wzorcowej

char m;

 

do{

 

system("cls");

 

cout << "MENU:" <<endl;

cout << "----------------------" <<endl;

cout << "k: kompresuj plik" << endl;

cout << "d: dekompresuj plik" << endl;

cout << "a: o autorze" << endl;

cout << "w: wyjscie" << endl ;

cout << "----------------------" <<endl;

cout << "?-> " ;

cin >> m;

 

switch(m){

case 'k': tab=komp();

break;

case 'd': tab=dekomp(tab);

break;

case 'a': autor();

break;

case 'w': exit(1);

break;

}

 

}while(m!='w');

 

getch();

//system("pause");

return 0;

 

}/////////////////////// KONIEC ///////////////////////////////

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...