C++ 哈夫曼压缩读取文件不会复制二进制文件c++;

C++ 哈夫曼压缩读取文件不会复制二进制文件c++;,c++,huffman-code,C++,Huffman Code,我的程序是哈夫曼压缩,一切都很好,除了一件恼人的事情。 当我从压缩文件中读取字节时,只有大约三分之一的字节被复制并解压缩(返回到正常文本)。 我真的不知道问题出在哪里。 以下是从文件读取字节并将其返回到STL容器的函数: template<class Container> Container readcompressfile(string ifileloc) { ifstream ifile(ifileloc); if (!ifile) { thro

我的程序是哈夫曼压缩,一切都很好,除了一件恼人的事情。 当我从压缩文件中读取字节时,只有大约三分之一的字节被复制并解压缩(返回到正常文本)。 我真的不知道问题出在哪里。 以下是从文件读取字节并将其返回到STL容器的函数:

template<class Container>
Container readcompressfile(string ifileloc) {
    ifstream ifile(ifileloc);

    if (!ifile) {
        throw runtime_error("Could not open " + ifileloc + " for reading");
    }

    noskipws(ifile);

    return Container(istream_iterator<uint8_t>(ifile), istream_iterator<uint8_t>());
}
模板
容器readcompressfile(字符串ifileloc){
ifstream ifile(ifileloc);
如果(!ifile){
抛出运行时_错误(“无法打开+ifileloc+”进行读取”);
}
noskipws(ifile);
返回容器(istream_迭代器(ifile),istream_迭代器();
}
下面是我在解压函数中调用它的方式(如果它很重要的话,调用它下面包含的另一个函数)(在类中):

void解压缩文件(字符串loc){
vector vecbytes(readcompressfile(ifilelocation));//这里是我使用上述函数的地方
向量::迭代器iter=vecbytes.begin();
uint8_t ctr=0xFF;
位集b2=0;
字符串代码=”;
对于(;iter!=vecbytes.end();++iter){
b2=ctr和iter;
对于(int i=7;i>=0;i--){
代码+=to_字符串(b2[i]);
}
}
解码文本(代码,loc);
}
//读取位并输出字符串
void decodetext(字符串codetext,字符串ofileloc){
字符串代码=”;
字符串文本=”;
查利特;
对于每个(codetext中的字符){
代码+=ct;
lett=返回字符映射(代码);
如果(lett!=NULL){
text+=lett;
代码=”;
}
}
文件流(OFILELLOC);

文件我猜您运行的是Windows,它会将文本流中的
^Z
字符(这是
ifstream
的默认模式)解释为文件结束指示器

而不是:

 ifstream ifile(ifileloc);
使用:


在下面的评论中指出,Windows平台还将在文本模式中将<>代码> \r\n“字符序列转换成单个字符<代码>”\n“/COD>”,而不是<代码> STD::ISTReAMMIATORATION/CODE >,您可以改为考虑。然后,您不必担心“空白”。至少。我使用了它,但没有起作用,它给了我一个错误,这不是Windows上唯一的问题,通常是换行符转换(

“\r\n”
“\r\n”
)。这是真的-应该提到的。发布的示例中的大小差异很大(应该作为文本复制/粘贴到问题中)让我直接去了EOF。事实上这就是问题所在,谢谢你现在它工作得很好
 ifstream ifile(ifileloc);
 ifstream ifile(ifileloc, ifstream::in | ifstream::binary);