#6
by にこよん » 6年前
前スレッドで教えていただいたzLib.libを同じ方法でリンクしたら無事エラーが起きることなくコンパイルできました。
Teppさん、そして前スレッドで沢山のことを教えていただいた皆様、ありがとうございました。
圧縮してファイルに書き出したり、ファイルから読み込んで展開したりすることにも成功したので、
今後同じことで悩んだ人のために残しておきます。(すごく汚いテストコードですが...)
間違った書き方をしていたり、もっとこういう書き方したほうがいいよとかアドバイスがあればご教示ください。
コード:
#pragma comment(lib, "Zlib.lib") //Zlibをリンクする
#include <zlib.h> //Zlibをインクルードする
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <string>
int Pressure(); //圧縮してファイルに保存する
int Expansion(); //ファイルから読み込んで展開する
int main() {
Pressure(); //圧縮してファイルに保存する
Sleep(1000);
Expansion(); //ファイルから読み込んで展開する
Sleep(1000);
std::cout << std::endl << "全ての処理が完了しました" << std::endl<< "10秒後に終了します" << std::endl;
Sleep(10000);
return 0;
}
//圧縮
int Pressure() {
int test[20] = { 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,0,0 };
int test2[40] = { 9,8,7,6,5,4,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
std::cout << "配列を定義しました" << std::endl;
for (int i = 0; i < 20; i++)
std::cout << test[i];
std::cout << std::endl;
for (int i = 0; i < 40; i++)
std::cout << test2[i];
std::cout << std::endl;
Bytef *buffer = (Bytef*)malloc(64 * 1024 * 1024); //保存するデータより十分大きいメモリを確保
int size = 0;
//テストデータ1をメモリに書き込み
memcpy(buffer + size, &test, sizeof(int) * 20);
size += sizeof(int) * 20;
//テストデータ2をメモリに書き込み
memcpy(buffer + size, &test2, sizeof(int) * 40);
size += sizeof(int) * 40;
Bytef *press_buffer = (Bytef*)malloc(64 * 1024 * 1024); //圧縮データより十分大きいメモリを確保
uLong press_size;
//~~~~~~~~~~~~~~~~~~~~~~~~~
// buffer のデータを圧縮して press_buffer に格納、圧縮後のデータサイズを press_size に格納する処理
//~~~~~~~~~~~~~~~~~~~~~~~~~
compress2(press_buffer, &press_size, buffer, uLong(sizeof(int) * 60), Z_BEST_COMPRESSION); //圧縮
std::cout << "データをメモリ上で圧縮しました" << std::endl;
FILE *fp;
errno_t err;
err = fopen_s(&fp, "data.sav", "wb"); //書き込みでファイルを開く
fwrite(&press_size, sizeof(uLong), 1, fp); //圧縮データのサイズを書き出し
fwrite(press_buffer, press_size, 1, fp); //圧縮データを書き出し
fclose(fp); //ファイルを閉じる
std::cout << "圧縮したデータをファイルに書き込みました" << std::endl;
free(buffer); //確保したメモリの解放
free(press_buffer);
return 0;
}
//展開
int Expansion() {
//-------------------------------------------------------------------------------
int r_test[20];
int r_test2[40];
std::cout << std::endl << "別の配列を定義しました" << std::endl;
for (int i = 0; i < 20; i++)
std::cout << r_test[i];
std::cout << std::endl;
for (int i = 0; i < 40; i++)
std::cout << r_test2[i];
std::cout << std::endl;
//-------------------------------------------------------------------------------
Bytef *buffer = (Bytef*)malloc(64 * 1024 * 1024); //保存するデータより十分大きいメモリを確保
uLong size = sizeof(int) * 60;
Bytef *press_buffer = (Bytef*)malloc(64 * 1024 * 1024); //圧縮データより十分大きいメモリを確保
uLong press_size;
FILE *fp;
errno_t err;
err = fopen_s(&fp, "data.sav", "rb"); //読み込みでファイルを開く
fread(&press_size, sizeof(uLong), 1, fp); //圧縮データのサイズを読み込み
fread(press_buffer, press_size, 1, fp); //圧縮データを読み込み
fclose(fp); //ファイルを閉じる
std::cout << "圧縮したデータをファイルから読み込みました" << std::endl;
uncompress(buffer, &size, press_buffer, press_size); //データを展開
std::cout << "圧縮したデータをメモリ上で展開しました" << std::endl;
size = 0;
//テストデータ1をメモリから読み込む
memcpy(r_test, buffer + size, sizeof(int) * 20);
size += sizeof(int) * 20;
//テストデータ2をメモリから読み込む
memcpy(r_test2, buffer + size, sizeof(int) * 40);
size += sizeof(int) * 40;
free(buffer); //確保したメモリの解放
free(press_buffer);
std::cout << "展開したデータを配列にコピーしました" << std::endl;
for (int i = 0; i < 20; i++)
std::cout << r_test[i];
std::cout << std::endl;
for (int i = 0; i < 40; i++)
std::cout << r_test2[i];
std::cout << std::endl;
return 0;
}
前スレッドで教えていただいたzLib.libを同じ方法でリンクしたら無事エラーが起きることなくコンパイルできました。
Teppさん、そして前スレッドで沢山のことを教えていただいた皆様、ありがとうございました。
圧縮してファイルに書き出したり、ファイルから読み込んで展開したりすることにも成功したので、
今後同じことで悩んだ人のために残しておきます。(すごく汚いテストコードですが...)
間違った書き方をしていたり、もっとこういう書き方したほうがいいよとかアドバイスがあればご教示ください。
[code]
#pragma comment(lib, "Zlib.lib") //Zlibをリンクする
#include <zlib.h> //Zlibをインクルードする
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <string>
int Pressure(); //圧縮してファイルに保存する
int Expansion(); //ファイルから読み込んで展開する
int main() {
Pressure(); //圧縮してファイルに保存する
Sleep(1000);
Expansion(); //ファイルから読み込んで展開する
Sleep(1000);
std::cout << std::endl << "全ての処理が完了しました" << std::endl<< "10秒後に終了します" << std::endl;
Sleep(10000);
return 0;
}
//圧縮
int Pressure() {
int test[20] = { 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,0,0 };
int test2[40] = { 9,8,7,6,5,4,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
std::cout << "配列を定義しました" << std::endl;
for (int i = 0; i < 20; i++)
std::cout << test[i];
std::cout << std::endl;
for (int i = 0; i < 40; i++)
std::cout << test2[i];
std::cout << std::endl;
Bytef *buffer = (Bytef*)malloc(64 * 1024 * 1024); //保存するデータより十分大きいメモリを確保
int size = 0;
//テストデータ1をメモリに書き込み
memcpy(buffer + size, &test, sizeof(int) * 20);
size += sizeof(int) * 20;
//テストデータ2をメモリに書き込み
memcpy(buffer + size, &test2, sizeof(int) * 40);
size += sizeof(int) * 40;
Bytef *press_buffer = (Bytef*)malloc(64 * 1024 * 1024); //圧縮データより十分大きいメモリを確保
uLong press_size;
//~~~~~~~~~~~~~~~~~~~~~~~~~
// buffer のデータを圧縮して press_buffer に格納、圧縮後のデータサイズを press_size に格納する処理
//~~~~~~~~~~~~~~~~~~~~~~~~~
compress2(press_buffer, &press_size, buffer, uLong(sizeof(int) * 60), Z_BEST_COMPRESSION); //圧縮
std::cout << "データをメモリ上で圧縮しました" << std::endl;
FILE *fp;
errno_t err;
err = fopen_s(&fp, "data.sav", "wb"); //書き込みでファイルを開く
fwrite(&press_size, sizeof(uLong), 1, fp); //圧縮データのサイズを書き出し
fwrite(press_buffer, press_size, 1, fp); //圧縮データを書き出し
fclose(fp); //ファイルを閉じる
std::cout << "圧縮したデータをファイルに書き込みました" << std::endl;
free(buffer); //確保したメモリの解放
free(press_buffer);
return 0;
}
//展開
int Expansion() {
//-------------------------------------------------------------------------------
int r_test[20];
int r_test2[40];
std::cout << std::endl << "別の配列を定義しました" << std::endl;
for (int i = 0; i < 20; i++)
std::cout << r_test[i];
std::cout << std::endl;
for (int i = 0; i < 40; i++)
std::cout << r_test2[i];
std::cout << std::endl;
//-------------------------------------------------------------------------------
Bytef *buffer = (Bytef*)malloc(64 * 1024 * 1024); //保存するデータより十分大きいメモリを確保
uLong size = sizeof(int) * 60;
Bytef *press_buffer = (Bytef*)malloc(64 * 1024 * 1024); //圧縮データより十分大きいメモリを確保
uLong press_size;
FILE *fp;
errno_t err;
err = fopen_s(&fp, "data.sav", "rb"); //読み込みでファイルを開く
fread(&press_size, sizeof(uLong), 1, fp); //圧縮データのサイズを読み込み
fread(press_buffer, press_size, 1, fp); //圧縮データを読み込み
fclose(fp); //ファイルを閉じる
std::cout << "圧縮したデータをファイルから読み込みました" << std::endl;
uncompress(buffer, &size, press_buffer, press_size); //データを展開
std::cout << "圧縮したデータをメモリ上で展開しました" << std::endl;
size = 0;
//テストデータ1をメモリから読み込む
memcpy(r_test, buffer + size, sizeof(int) * 20);
size += sizeof(int) * 20;
//テストデータ2をメモリから読み込む
memcpy(r_test2, buffer + size, sizeof(int) * 40);
size += sizeof(int) * 40;
free(buffer); //確保したメモリの解放
free(press_buffer);
std::cout << "展開したデータを配列にコピーしました" << std::endl;
for (int i = 0; i < 20; i++)
std::cout << r_test[i];
std::cout << std::endl;
for (int i = 0; i < 40; i++)
std::cout << r_test2[i];
std::cout << std::endl;
return 0;
}
[/code]