C++でファイルのパッキングをしているのですが、うまくいきません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
fulls

C++でファイルのパッキングをしているのですが、うまくいきません

#1

投稿記事 by fulls » 9年前

C++でファイルのパッキングをしているのですが、うまくいきません。
コードはこれです↓

コード:

/*==================
	画像ファイルパッキングプログラム

	※文字列の区切りに"#"を使用
*/
#define _CRT_SECURE_NO_DEPRECATE 1
#include<iostream>
#include<Windows.h>
#include<conio.h>


#define NameSize 2048*5
#define FileAmount 2
#define PackingName "th00s.dat"
#define MAXSIZE 1019205    //






int main(){
	//ファイル名
	char FileName[FileAmount][NameSize]={
		"Graph\\01.bmp",
		"Graph\\01.jpg"
	};
	//FILE構造体
	FILE *fp;
	//画像個数(char)
	char a[48];
	//既にあるときは初期化
	fopen(PackingName,"w");
	//先頭に画像の個数を書き込む
	sprintf(a,"%d",FileAmount);
	fp=fopen(PackingName,"a");
	//書き込み
	fputs(a,fp);
	fputs("#",fp);

	//画像ヘッダーの書き込み
	for(int i=0;i<FileAmount;i++){
		fputs(FileName[i],fp);
		fputs("#",fp);
		//画像データの書き込み
		FILE *Graph;
		Graph=fopen(FileName[i],"rb");
		if(Graph==NULL){
			std::cout<<i<<" 個目の画像データがありません"<<std::endl;
			fputs("NULL",fp);
		}else{
			int size;
			int size0;
			char *Data[10000];

			//読み込み
			size=fread(Data,1,MAXSIZE,Graph);
			size0=size;
			std::cout<<i<<" 個目のデータは"<<size0<<" Bです。"<<std::endl;

			//サイズの書き込み
			char Size[512];
			sprintf(Size,"%d",size);
			fputs(Size,fp);
			fputs("#",fp);

			//書き込み
			fwrite(Data,size,1,fp);
			fclose(Graph);
			fputs("#",fp);
		}
	}
	//終了
	std::cout<<"完了"<<std::endl;
	fclose(fp);
	getch();
	return 0;
}
です。

実行結果が、


0 個目のデータは0 Bです。
1 個目のデータは0 Bです。
完了

とでて、できあがったファイルをバイナリエディタでひらくと画像データが入っていません。
因みに、画像データはちゃんとあります。

どうしたら良いか、わかる方は教えてください。
よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: C++でファイルのパッキングをしているのですが、うまくいきません

#2

投稿記事 by h2so5 » 9年前

54行目:
char *Data[10000];
この宣言はおかしくないですか?

fulls
記事: 72
登録日時: 9年前
住所: 埼玉

Re: C++でファイルのパッキングをしているのですが、うまくいきません

#3

投稿記事 by fulls » 9年前

ご指摘ありがとうございました。 
直してみたのですが、うまくいきません。

コード:

size=fread(Data,1,MAXSIZE,Graph);
の返り値が0でそれがsizeに代入されるので、この関数の後にsize=100のように入れたところ、できたファイルをバイナリエディタで開くと、その部分がすべて"C"となっていて、どうやら画像データが読み込めてないみたいかもしれないんですよ。
どうすればいいか教えてください。

maru
記事: 150
登録日時: 9年前

Re: C++でファイルのパッキングをしているのですが、うまくいきません

#4

投稿記事 by maru » 9年前

突っ込みどころが満載のソースコードですね。

とりあえず、fread, fwriteの使い方が間違ってます。

コード:

char *Data[10000];
size=fread(Data,1,MAXSIZE,Graph);
fwrite(Data,size,1,fp);

コード:

char Data[10000];
size=fread(&Data,1,sizeof(Data),Graph);
fwrite(&Data,size,1,fp);
で動作しました。
ただし、個々のファイルサイズは10000バイト以下です。
10000バイト以上になる場合、繰り返しが必要です。

#define MAXSIZE 1019205 //
ではfread(&Data,1,MAXSIZE,Graph);
が0を返し、errorは22(引数不正)でした。使用できる最大サイズがあるようです。
デバッガの使用方法を覚えることをお勧めします。

では、これ以外に気付いた点をいくつか。

コード:

#define NameSize 2048*5
#define FileAmount 2
    char FileName[FileAmount][NameSize]={
         "Graph\\01.bmp",
         "Graph\\01.jpg"
    };
ファイル名を格納するバッファに2048*5は多すぎます。コンパイラで定義済みの値か、コンパイラに文字数を計算させましょう。
コンパイラが計算できる定数(FileAmount:ファイル数)はマクロせず、sizeof演算子を使用しましょう。
記述するなら以下の通り。

コード:

    char *FileName[]={
         "Graph\\01.bmp",
         "Graph\\01.jpg"
    };
    const int FileAmount = sizeof(FileName)/sizeof(char*);

コード:

    //既にあるときは初期化
    fopen(PackingName,"w");
    fp=fopen(PackingName,"a");
常に作り直すのであれば、削除("w")して追加書込み("a")は無駄、単純に新規書込み("w")で可です。

コード:

    fp=fopen(PackingName,"w");

コード:

char *Data[10000];
size=fread(Data,1,MAXSIZE,Graph);
ファイルサイズがバッファサイズを超えたいる場合、暴走します。
バッファサイズ以内で読み込み、ファイル終了を確認しましょう。
サンプルコードはまたいつか。

fulls
記事: 72
登録日時: 9年前
住所: 埼玉

Re: C++でファイルのパッキングをしているのですが、うまくいきません

#5

投稿記事 by fulls » 9年前

ありがとうございました。
無事できました。
10000バイト以上のファイルも読み込めるようにしました。

maru
記事: 150
登録日時: 9年前

Re: C++でファイルのパッキングをしているのですが、うまくいきません

#6

投稿記事 by maru » 9年前

yucky001 さんが書きました:ありがとうございました。
無事できました。
10000バイト以上のファイルも読み込めるようにしました。
どうやって解決したのかを書いてみてください。
10000バイト以上のファイルといってもどのサイズまで可能でしょうか?
たまたま動いているだけということはないですか?
充分に大きなファイルであっても実行可能なアルゴリズムになっているか疑問です。

フォーラムルールにも「解決した方法を明記して下さい。」とあります。

ISLe
記事: 2648
登録日時: 10年前
連絡を取る:

Re: C++でファイルのパッキングをしているのですが、うまくいきません

#7

投稿記事 by ISLe » 9年前

sprintf→fputsのセットをfprintfにまとめることもできますね。

閉鎖

“C言語何でも質問掲示板” へ戻る