在文件中编写元素,读取不同的元素

时间:2014-04-15 15:55:34

标签: c++ fstream huffman-code

我有一个C ++程序,它在一个文件(fstream)上写入'map'中的所有'key'(char)和'value'(int)。然后我关闭了流,但是当我稍后阅读这个文件时,我注意到它打印的内容不是文件中的内容。 你能帮我找到问题吗?谢谢!

以下是代码:

void Encoder::get_freq_tab()
{
map<unsigned char,int>::iterator it;
int next=0;
while((next = text.get()) != EOF)
{
    unsigned char uc = unsigned char(next);
    it=char_freq.find(uc);
    if(it!=char_freq.end())
        ++(it->second);
    else
        char_freq.insert(make_pair(uc,1));
}
text.clear();
}


void Encoder::write_h_code(string s)
{
    out.open(&s[0],ios::out | ios::binary);
    string code;
    char c;
    unsigned char acc=0;
    int bit,bitpos=0,cont,n;
    cont=mytree.get_tree_freq();    
    map<unsigned char, int>::iterator it;
    out<<unsigned char(char_freq.size());
    cout<<"ENCODER number of chars = "<<int(char_freq.size())<<endl;
        for(it=char_freq.begin();it!=char_freq.end();++it)
{
    c=((*it).first);
    n=(*it).second;     
    out<<unsigned char(c);
    out<<int(n);
    cout<<"ENCODER wrote "<<int(c)<<" .Size = "<<sizeof(c)<<" .Freq = "<<n<<" . Size = "<<sizeof(n)<<endl;
}
}

这部分仅涉及从文件中读取字节,将频率存储在映射char_freq中,并首先写入存储的字符数,然后是所有键和值。 现在是它回读此文件的部分。

void Decoder::extract_leaves(){
unsigned char c,tot;
int n,size;
in>>(tot);  // set size, per controllare il limite delle foglie
size=(tot);
cout<<endl<<"DECODER number of char = "<<size<<endl;
for(int i=0;i<size;++i)
    {
    in>>unsigned char(c);   // reading char 
    in>>int(n);     // reading frequence
    cout<<" Decoder Val "<<int(c)<<" Freq = "<<int(n)<<endl;
    }

}

当我打印并读取同一个文件时,我看到其他的频率值,就像它为一个int写了更多的字节,所以有些值不会出现,因为它在阅读时会“跳过”它们。

1 个答案:

答案 0 :(得分:2)

编写二进制数据时,不能使用in >> xout << x,因为这些是&#34;文本读写&#34;功能。

所以,而不是:

out<<unsigned char(c);
out<<int(n);

你需要使用:

out.write(&c, sizeof(c));
out.write(reinterpret_cast<char*>(&n), sizeof(n));

更详细地解释:

n = 12345;
out << n; 

将输出12345作为单个字符。

如果输出:

c = '1';
n = 2345;
out << c << n;

然后输出也看起来像12345

另一方面,in >> c将跳过空格,所以

c = ' ';
n = 1234;
out << c << n;

in >> c >> n; 
输入后

将有c == '1'n==234