掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26950

ファイルのヘキサダンプについて。。。
投稿者---ひつぢ(2006/05/22 18:54:43)


C言語初心者です。
今、ファイルをバイナリ表示するコンソールアプリケーションを作っている途中です。
自分で出来る限り書いてみたのですが、コンパイルが通りません;;
自分でどこがおかしいのか分からずドツボにはまっています(T_T)


int main( int argc, char *argv[ ] )
{

    FILE *fp;

    // このソースを表示

    fp = fopen( "TEST.txt", "rb" );
    if ( fp == NULL ) {
        printf( "%s\n", "入力ファイルのオープンに失敗" );
        return 1;
    }

    void DspDump( char *buffer )

    {
        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;
            DspDump( buffer );
        }

    fclose( fp );
    return 0;
    }

}

/* 16バイト毎にデータを表示 */
void DspDump( char *buff )
{
    int i, j;
    char HexChar[4];

    /* 16進数を表示 */
    for( i = 0; i < strlen(buff); i++ ) {
        sprintf( HexChar, "%02X ", 0x000000ff & *(buff+i) );
        printf( "%s", HexChar );
    }
    for( j = i; j < 16; j++ ) {
        printf( "   " );
    }

    printf( "   " );

    /* 実際のデータを表示 */
    for( i = 0; i < strlen(buff); i++ ) {
        CharPrint( (int)(0x000000ff & *(buff+i)) );
    }

    printf( "\n" );

}

/* 1バイトのデータの表示 */

void CharPrint( int i )
{
    if ( 0 <= i && i <= (int)0x1f ) {
        printf( "." );
    }
    if ( (int)0x20 <= i && i <= (int)0xff ) {
        printf( "%c", (char)i );
    }
}


よろしくお願いします><


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイルのヘキサダンプについて。。。 26951 REE 2006/05/22 19:00:19


No.26951

Re:ファイルのヘキサダンプについて。。。
投稿者---REE(2006/05/22 19:00:19)


>自分で出来る限り書いてみたのですが、コンパイルが通りません;;

そういう時は、エラーメッセージとその発生行を提示しましょう。



この投稿にコメントする

削除パスワード

No.26952

Re:ファイルのヘキサダンプについて。。。
投稿者---ひつぢ(2006/05/22 19:04:05)


>そういう時は、エラーメッセージとその発生行を提示しましょう。

すみません;;
コンパイル時にでるエラーは、
TEST.c(21) : error C2143: 構文エラー : ';' が 'type' の前に必要です。
TEST.c(25) : error C2143: 構文エラー : ';' が 'type' の前に必要です。
TEST.c(30) : error C2065: 'size' : 定義されていない識別子です。
TEST.c(40) : error C2065: 'ret' : 定義されていない識別子です。
TEST.c(40) : error C2065: 'buffer' : 定義されていない識別子です。
TEST.c(40) : warning C4022: 'fread' : 1 番目の実引数のポインタの型が、仮引数のポインタの型と異なります。 
TEST.c(44) : error C2109: 配列または、ポインタでない変数に添字が使われました。
TEST.c(44) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
TEST.c(45) : warning C4013: 関数 'DspDump' は定義されていません。int 型の値を返す外部関数と見なします。
TEST.c(52) : error C2059: 構文エラー : '}'


です。




この投稿にコメントする

削除パスワード

No.26953

Re:ファイルのヘキサダンプについて。。。
投稿者---YuO(2006/05/22 19:43:42)


>コンパイル時にでるエラーは、
>TEST.c(21) : error C2143: 構文エラー : ';' が 'type' の前に必要です。
が先頭にあるので,21行目より前に問題があります。

たぶん,21行目は
    void DspDump( char *buffer )

    {
        char buffer[16+2];

この最後の行ではないかと。

(main)関数内で関数の定義を行っているので,C2143が発生しているのだと思います。
引用した先頭の行をmain関数の前に出して前方宣言にしてしまえば(最後に;を付けてやる必要有り),
21行目のエラーは解決するのではないかと思います。
# 結構連鎖してエラーが消えそうな感じです。


この投稿にコメントする

削除パスワード

No.26955

ありがとうございます!!
投稿者---ひつぢ(2006/05/22 21:09:06)


できました〜!!!
本当にありがとうございます!!!m(__)m

また分からない事があったらよろしくです。
ありがとうございました。


この投稿にコメントする

削除パスワード

No.26958

Re:ありがとうございます!!
投稿者---あしっど(2006/05/23 09:18:27)


自分の目が悪くなったんだろうか…
void DspDump()が二つあるように見える…

ざっと見ただけでも、mainの引数argc argvが使われてない。
mainのreturn 0がない(DspDumpと兼用したい?それは無茶です)
void型なのに0を返してる(mainと勘違い?)
他の関数はreturnすらしてない。
strlenの戻り値は符号無しなので、iをunsignedしないといけない。
引数でbuffer貰ってるのに、再宣言してる。

ざっとコンパイラ通しただけでも上記のようなエラー&警告がでます。
一体何のコンパイラを使ってるんでしょう。

…もしかして自分釣られてます?


この投稿にコメントする

削除パスワード

No.26959

Re:ありがとうございます!!
投稿者---breakwind4u(2006/05/23 12:07:17)


本来の意図は、たぶん以下の通りです。

・main() 内にある DspDump() はただのプロトタイプ宣言
・その直下の { はブロックを開いているだけ

DspDump() の後に ';' が抜けているので、プロトタイプ宣言
には見えずに、関数の中で入れ子の関数を定義しているように
見えてしまったのでしょう。

以下のように書けば、なんとなく正しいコードに見えてきます :-P

int main( int argc, char *argv[ ] )
{

    FILE *fp;

    /* 略 */

    void DspDump( char *buffer );
    void CharPrint( int i );

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

        /* 略 */

        return 0;
    } while (0);
}

void DspDump( char *buff )
{
    /* 略 */
}

void CharPrint( int i )
{
    /* 略 */
}





この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧