私はハフマン エンコーダーを作成しています。そのためには、入力 (常にリダイレクトされたファイル) を読み込んで周波数を記録し、コードブックを作成してから、入力を再度読み込んでエンコードできるようにする必要があります。
私の問題は、ファイルをcinから2回読み取る方法を現在テストしようとしていることです。
ファイルがリダイレクトされ、パイプされない限り、 cin.seekg(0) または cin.seekg(ios::beg) または cin.seekg(0, ios::beg) はすべて完全に正常に機能するはずであることをオンラインで読みました。しかし、私がそれを行うと、cinの位置にはまったく何もしないようです.
ここに私が現在使用しているコードがあります:
#include<iostream>
#include"huffmanNode.h"
using namespace std;
int main(){
//create array that stores each character and it's frequency
unsigned int frequencies[255];
//initialize to zero
for(int i=0; i<255; i++){
frequencies[i] = 0;
}
//get input and increment the frequency of corresponding character
char c;
while(!cin.eof()){
cin.get(c);
frequencies[c]++;
}
//create initial leafe nodes for all characters that have appeared at least once
for(int i=0; i<255; i++){
if(frequencies[i] != 0){
huffmanNode* tempNode = new huffmanNode(i, frequencies[i]);
}
}
// test readout of the frequency list
for(int i=0; i<255; i++){
cout << "Character: " << (char)i << " Frequency: " << frequencies[i] << endl;;
}
//go back to beginning of input
cin.seekg(ios::beg);
//read over input again, incrementing frequencies. Should result in double the amount of frequencies
**THIS IS WHERE IT LOOPS FOREVER**
while(!cin.eof()){
cin.get(c);
frequencies[c]++;
}
//another test readout of the frequency list
for(int i=0; i<255; i++){
cout << "Character: " << (char)i << " Double Frequency: " << frequencies[i] << endl;
}
return 0;
}
デバッグすると、40 行目の while ループでスタックし、常に改行文字を取得しているように見えます。なぜこのループから抜け出せないのでしょうか? cin.seekg() は実際には入力をリセットしていないと思います。