我有一个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写了更多的字节,所以有些值不会出现,因为它在阅读时会“跳过”它们。
答案 0 :(得分:2)
编写二进制数据时,不能使用in >> x
或out << 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
。