2011-03-11 6 views
0

나는지도를 처음 사용하므로이 작업을 수행하는 가장 좋은 방법이 확실하지 않습니다. 이 작업은 허프만 코딩을 사용한 압축과 관련이 있습니다. 내가 가지고있는 것을 창작한다.문자열의 2 키로 맵을 채 웁니다. 문자 및 빈도 C++

#include <map> 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

typedef map<char,int> huffmanMap; 

void getFreq(string file, map<char, int> map) 
{ 
    map.clear();  
    for (string::iterator i = file.begin(); i != file.end(); ++i) { 
     ++map[*i]; 
    } 
} 

위에서 내가 온라인을 발견하지만 문자열 fileline을 채우는 텍스트 파일에서 읽을

int main() 
{ 
    map<char, int> huffmanMap; 
    string fileline; 

    ifstream myfile; 
    myfile.open("text.txt",ios::out); 

    while(!myfile.eof()) { 
    getline(myfile, fileline); //get the line and put it in the fileline string 
    } 
    myfile.close(); 

아무것도를 인쇄 할 수 없습니다 하나의 방법이다. 여기

for (int i=0; i<fileline.length(); i++) { 
     char t = fileline[i]; 
     huffmanMap[i]? huffmanMap[i]++ : huffmanMap[i]=1; 
    } 

getFreq(fileline,huffmanMap); 

    huffmanMap::iterator position; 
    for (position = huffmanMap.begin(); position != huffmanMap.end(); position++) { 
     cout << "key: \"" << position->first << endl; 
     cout << "value: " << position->second << endl; 
    } 

이 내가지도를

system("pause"); 
    return 0; 
} 
을 인쇄하려고하는 방법입니다 .. 숯불 값이 잘못된 기호와 smileyfaces 있습니다 내가지도를 채우는 시도 두 번째 방법이다

getFreq 메서드를 실행하면 프로그램이 충돌합니다. 나는 어느 쪽이든을 가진 어떤 과실도 얻지 않는다. 두 번째 방법을 사용하면 char 값은 의미가 없습니다. 두 메서드를 동시에 실행하지 않았으므로 방금 시도한 결과를 보여주기 위해 두 메서드를 모두 포함 시켰습니다.

어떤 통찰력도 감사 할 것입니다. 감사합니다. 제발 초보자 라야 해)

+0

비정상적인 형식이 수정되었습니다. 스택 오버플로에 게시물을 제출하기 전에 "미리보기 창"을 사용하십시오. –

+0

'while (! .eof)'이 잘못되었습니다 : http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.5. 이게 옳았다는 것을 어디에서 알았습니까? 많은 사람들이 그것을하고 왜 그 이유를 알고 싶습니다. –

+0

또한 디버거에서 문제에 대해 뭐라고 말 했나요? –

답변

2

하나의 수정과 하나의 개선.

수정은 다음과 같습니다

void getFreq(string file, map<char, int> & map); //notice `&` 

개선은 다음과 같습니다 : getFreq 참조 두 번째 매개 변수를 만들 huffmanMap[i]?을 작성하여, 단지 대신 결국

huffmanMap[i]? huffmanMap[i]++ : huffmanMap[i]=1; 

huffmanMap[i]++; 

쓰기 ' 그것이 0인지 아닌지를 다시 확인합니다. 0 일 경우 huffmanMap[i]++과 동일하게 만듭니다.

3

코드가 여기 저기 있습니다. 흐름을 이해하기가 너무 어렵습니다. 여기

약간 낮은 조명입니다

이 잘못 : myfile.open("text.txt",ios::out); - 왜 out 플래그 입력 스트림을 열 것인가? 단순히해야한다 :

while 루프에서
string fileline; 
ifstream myfile("text.txt"); 

while(getline(myfile, fileline)) { 
    // now use fileline. 
} 

, 싶은 것은 내용을 반복하여지도에 추가하는 것입니다?

string fileline; 
ifstream myfile("text.txt"); 

while(getline(myfile, fileline)) { 
    getFreq(fileline, huffmanMap); 
} 

다음 수정이가 잘못 :처럼 이제 코드를 보이는 당신은 타입 정의와 같은 이름의 변수가!

typedef map<char,int> huffmanMap; 

map<char, int> huffmanMap; 

사용 재치있는 이름

typedef map<char,int> huffmanMap_Type; 

huffmanMap_Type huffmanMap; 

다음 수정, 당신의 getFreq 방법 서명이 잘못된 것입니다, 당신은 그래서 당신이 함수에서 수정, 오히려 기준 이상 (예 : 복사) 값을 기준으로지도를 전달하는 원본이 아닌 복사본을 만드는 것입니다!

잘못된 : void getFreq(string file, map<char, int> map)

올바른 : void getFreq(string file, huffmanMap_Type& map)

다음 : 위의 방법clear()? 둘 이상의 라인이 있다면? 그럴 필요가 없습니까?

이제 충분합니다. 문제가 더 많으면 코드를 정리하고 질문을 업데이트하십시오.

관련 문제