データが全て16バイトになってしまう
解決したいこと
ランレングス圧縮を実現するプログラムを作成しているのですが、すべて16バイトに書き換えられてしまいます。
下記のサイトを参考にコーディングしました。エラーなどは出ていません。
https://algoful.com/Archive/Algorithm/RLE
Visual Studio C++ 17です。
該当するソースコード
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
class RLE
{
public:
void Encode(std::string inputFile);
std::vector<char> EncodeRunLength(char buffer[], int size);
std::vector<char> GetRunLength(char c, int length);
};
void RLE::Encode(std::string inputFile)
{
//バイナリファイルで読み込む
std::ifstream in
{
inputFile,
std::ios::binary
};
if (!in) {
std::cout << "ファイルが読み込まれていません" << std::endl;
}
//ファイルサイズを調べる
in.seekg(0, std::ios::end);
size_t size = static_cast<size_t>(in.tellg());
in.seekg(0, std::ios::beg);
//読み込んだデータをchar配列に格納する
char* buffer = new char[size];
in.read(buffer, size);
in.close();
//圧縮
auto enc = EncodeRunLength(buffer, size);
//ファイルに書き込み
std::ofstream out
{
inputFile,
std::ios::binary
};
//ベクターを配列に変換
char* encArray = new char[enc.size()];
std::copy(enc.begin(), enc.end(), encArray);
out.write(encArray, sizeof(enc));
delete buffer;
delete encArray;
out.close();
}
//ファイルを圧縮する
std::vector<char> RLE::EncodeRunLength(char buffer[], int size)
{
std::vector<char> result;
int length = 0;
char b = 0;
for (int i = 0; i < size; ++i)
{
if (i == 0)
{
// 1文字目の場合保持
length = 1;
b = buffer[0];
}
else if (buffer[i] == b)
{
// 直前の文字と一致していればカウントアップ
length++;
}
// 不一致のタイミングで出力
if (buffer[i] != b)
{
std::vector<char> rl = GetRunLength(b, length);
result.insert(result.end(), rl.begin(), rl.end());
// 文字データ更新
length = 1;
b = buffer[i];
}
}
// 最後の圧縮結果を出力
std::vector<char> rl = GetRunLength(b, length);
result.insert(result.end(), rl.begin(), rl.end());
return result;
}
//圧縮文字列を返す
std::vector<char> RLE::GetRunLength(char c, int length)
{
std::vector<char> result;
const int MaxLength = 255;
for (int i = 1; i <= length; ++i)
{
if (i % MaxLength == 0)
{
result.push_back(c);
result.push_back(MaxLength);
}
else if (i == length)
{
// 最終文字数時点で出力
result.push_back(c);
result.push_back(static_cast<char>(length % MaxLength));
}
}
return result;
}
### 自分で試したこと
0バイトのテキストデータで試しても、16バイトになってしまうため、
おそらくout.write(encArray,sizeof(enc))のencArrayが原因ではないかと思っています。