こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

printf出力不調?

学校の授業で作成しているプログラムです。

#include <stdio.h>
#include <string.h>

// *********************************
// メインプログラム
// *********************************
int main()
{

FILE*fp;
charfname[256];//ファイルの内容, ファイル名
int i = 0, Mmemory[16], k, j, cut = 0;


//指定ファイル名の取得
printf(">>圧縮または解凍するファイルを指定してください。\n>>例) C:\Documents and Settings\jibun\デスクトップ\圧縮.txt\n>>ファイルの場所:");
gets(fname);

//ドラックアンドドロップか確認
while(fname[i] == '"'){
i = 1;
}
//ドラックアンドドロップだった時の処理
if(i > 0){
//最後の”を削除
i = 0;
while(fname[i] != '\0'){
i++;
}
i -= 1;
fname[i] = fname[i+1];
//最初の”を削除
for(i = 0; fname[i] != '\0'; i++){
fname[i] = fname[i+1];
}
}

// このソースを表示
fp = fopen( fname, "rb" );
if ( fp == NULL ) {
printf( "%s\n", "入力ファイルのオープンに失敗しました" );
return 1;
}

char buffer[16+2];
int size,ret;

// ファイルサイズの取得
fseek( fp, 0, SEEK_END );
size = ftell( fp );

// ファイルポインタを先頭に戻す
fseek( fp, 0, SEEK_SET );
printf( "FileSize = %d\n\n", size );

while( !ferror( fp ) ) {
// 1バイト * 16 の読込み
ret = fread( buffer, 1, 16, fp );
if ( ret == 0 ) {
break;
}
buffer[ret] = 0x00;
// 16進数の表示
for( i = 0; i < strlen(buffer); i++ ) {
k = (0x000000ff & *(buffer+i));
Mmemory[cut] = k;
cut++;

}
}
fclose( fp );
printf("chak1\n");  //これ以降が表示しません。
cut -= 1;
for(i = 0; i < cut; i++)
printf("%02X ",Mmemory[i]);
return 0;

}

なぜか、最後のwhile後の出力が行えません。
分かる方は教えてください!!

投稿日時 - 2008-08-27 23:40:37

QNo.4283946

困ってます

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

★回答者No.2です。
 よく調べたら Mmemory 配列のサイズ不足ですね。
 このサイズが不足しているため最後の while ループでエラーが発生。
 下に動いたソースを貼って置きます。

ソース:
int i, Mmemory[ 16 * 1024 ], cut = 0; ←宣言行で Mmemory の添え字を修正。

while ( !feof(fp) && !ferror(fp) ){
 // 1バイト * 16 の読込み
 ret = (int)fread( buffer, 1, 16, fp );
 if ( ret == 0 ){
  break;
 }
 buffer[ ret ] = 0x00; ←いらない行
 // 16進数の表示
 for ( i = 0 ; i < ret ; i++ ){ ←『strlen(buffer)』から『ret』に変更。
  Mmemory[ cut++ ] = buffer[ i ];
 }
}

・コメントを付けましたのでソースを見ながら読んで下さい。
 バイナリーでファイルをオープンしているため『16進数の表示』では
 読み込んだサイズ『ret』でループするようにします。
 『strlen(buffer)』は文字列です。
 今回は文字列ではないから注意。
・あと最後の『cut -= 1;』はどんな意味があるのでしょうか。
 デクリメントすると最後の1バイト分は16進表示されませんが…。

投稿日時 - 2008-08-28 15:46:40

お礼

いろいろやってみたんですが、なりませんね。
コンパイルエラーは出ないのですが、実行ファイルを実行するとエラーになります。
あと、『cut -= 1;』のcutはデータを入れた回数を数えていただけで、深い意味はありません。
いろいろお手数をおかけして申し訳ありませんでした。

投稿日時 - 2008-08-29 13:36:00

ANo.3

直接関係ないのですが、以下の部分は間違っています。

printf(">>圧縮または解凍するファイルを指定してください。\n>>例) C:\Documents and Settings\jibun\デスクトップ\圧縮.txt\n>>ファイルの場所:");

ディレクトリ区切りのバックスラッシュをエスケープしないと正常に
表示されないのでは。
単なる記述間違い?コピペすればいいだけのような気もしますが。

投稿日時 - 2008-08-28 11:55:23

ANo.2

★アドバイス
>なぜか、最後のwhile後の出力が行えません。
>分かる方は教えてください!!
 ↑
 最後の while で無限ループしていませんか?
 この『while( !ferror( fp ) ) {』に feof() を追加して
 『while( !feof(fp) && !ferror(fp) ) {』とするとどうなるでしょうね。
 試してみましょう。
・あと
>while(fname[i] == '"'){
>i = 1;
>}
 ↑
 この3行もおかしい気がします。
 『fname』が『""』だったとき無限ループします。

投稿日時 - 2008-08-28 01:26:55

お礼

『while( !ferror( fp ) ) {』の部分を『while( !feof(fp) && !ferror(fp) ) {』に変更しました。
しかし、やっぱり『printf("chak1\n");』の部分などは表示されません。もう少し考えてみます。
あと、確かに『while(fname[i] == '"'){』は無限ループになる可能性があると、『i』の部分を『0』にしました。
ありがとうございました。

投稿日時 - 2008-08-28 11:31:25

ANo.1

> Mmemory[cut] = k;
> cut++;

この cutがどう変化するかデバッガで追いかけてみてください。
配列の大きさを越えて変化し続けますよ。

投稿日時 - 2008-08-28 01:13:36

お礼

これは、後々ポインタでやる予定だったものをそのまま記載してしまったみたいです。すみません。

投稿日時 - 2008-08-28 11:26:16

あなたにオススメの質問