我在mac上使用lz4并在我的程序中进行压缩字符串(名为str)的实验。
#include <fstream>
#include <iostream>
#include "lz4.h"
using namespace std;
int main(){
char str[] = "10100100010000100000100000010000000100000000100000000010000000000";
size_t len = sizeof(str);
char* target = new char[len];
int nCompressedSize = LZ4_compress_default((const char *)(&str), target, len, len);
ofstream os("lz4.dat",ofstream::binary);
os.write(target, nCompressedSize);
os.close();
delete[] target;
target = 0;
ifstream is( "lz4.dat", ifstream::binary );
is.seekg (0,is.end);
size_t nCompressedInputSize = is.tellg();
is.clear();
is.seekg(0,ios::beg);
//Read file into buffer
char* in = new char[nCompressedInputSize];
int32_t n=is.read(in,nCompressedSize);
cout<<"Byte number:"<<nCompressedSize<<",file size:"<<n<<",bytes read:"<<in<<endl;
is.close();
return 0;
}
运行此程序,我检查了&#34; lz4.dat&#34;文件:
$ls -lrt lz4.dat
-rw-r--r-- 1 x staff 34 7 15 14:50 lz4.dat
它是34个字节,好的,但程序输出是:
Byte number:34,file size:1,bytes read:@1010
很奇怪,似乎收到的文件大小是1个字节,我实际上输出了一些@ 1010的randome。为什么我的&#34; is.tellg()&#34;没有正确的文件长度?
感谢。
答案 0 :(得分:2)
ifstream::read()
不返回读取的字节数。它会返回对*this
的引用,其中包含operator bool()
,我认为这种情况会被使用。所以你在n
,你得到的操作是否成功。
输出似乎完全正常,它是压缩数据的开始。我认为只打印了几个字节,因为它包含一个终止零。它类似于你的输入,因为lz4将文字逐字地放入流中(lz4没有熵编码)