• 締切済み

printf出力不調?

学校の授業で作成しているプログラムです。 #include <stdio.h> #include <string.h> // ********************************* // メインプログラム // ********************************* int main() { FILE *fp; char fname[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後の出力が行えません。 分かる方は教えてください!!

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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進表示されませんが…。

kerneru
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • pick52
  • ベストアンサー率35% (166/466)
回答No.3

直接関係ないのですが、以下の部分は間違っています。 printf(">>圧縮または解凍するファイルを指定してください。\n>>例) C:\Documents and Settings\jibun\デスクトップ\圧縮.txt\n>>ファイルの場所:"); ディレクトリ区切りのバックスラッシュをエスケープしないと正常に 表示されないのでは。 単なる記述間違い?コピペすればいいだけのような気もしますが。

すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

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

kerneru
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

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

kerneru
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A