텍스트 파일이 있고 LZW 알고리즘을 올바르게 구현했다고 생각되지만 압축 된 파일이 원본보다 커졌습니다.원본보다 큰 LZW 압축 생성 파일
텍스트의 바이트가 아니라 문자열 대신 LZW를 실행하고 있습니다.
사전 [string:int]
을 만들고 실행합니다. 문자열 대신 바이트를 사용해야하는지 궁금합니다.
또한 전체 파일에 대해 하나의 사전 만 작성하는 대신 파일의 줄 단위로 실행됩니다.
이
내 LZWmap<string, int> D; //dictionary
int init(){ //init dictionary with all single chars
D.clear(); rD.clear();
f(i,,256){
D[string(1, char(i))] = i + 1;
}
return 257;
}
void encode(char* file){ //LZW encoding method
ifstream in(file);
if (!in.is_open()) {cout<<"Could not open file"<<endl; return;}
else {
ofstream out("compressed.txt");
for(string text; getline(in, text);){
int value = init();
vector<int> idx;
string p = "", c = "", pc = "";
for(int i = 0; i < text.size(); i++){
c = text[i];
let s = p + c;
if(D.find(s) != D.end()){
p = p + c;
}
else{
idx.push_back(D[p]);
D[s] = value++;
p = c;
}
}
idx.push_back(D[p]);
int len = idx.size();
f(i,,len) {out<<idx[i]; if(i == len-1) out<<" 0"<<endl; else out<<" ";}
}
in.close();
out.close();
cout<<"File compressed successfully"<<endl;
}
}
그냥 파일의 주소를 수신하고 그것에 "compressed.txt"파일을 압축합니다.
우선 텍스트 파일에서 출력하고 있지만 바이너리가 무엇인지 더 잘 설명 할 수 있습니까? –
이 필요합니까? 나는 어떻게 이것을 하는가? 그리고 그것은 나를 어떻게 도울 것인가? – Daniel
바이너리 출력을 위해 출력 파일을 열어야합니다 :'ofstream out ("compressed.txt", std :: ios :: binary); '. 당신이 글을 쓰려고한다고 상상해보십시오. 1234는 파일에, 텍스트 모드에서는 4 바이트가 걸리지 만 2 진수에서는 단지 2 –