2011-01-07 18 views
1
#include <stdio.h> 
#include<stdio.h> 
#include <ctype.h> 

    /** 
    * Display the contents of a stream as hexadecimal bytes and text. 
    * @param file pointer to a binary stream 
    * @return the number of bytes in the file read 
    */ 
    size_t hexdump(FILE *file,FILE *fp,FILE *fp1) 
    { 
     unsigned char data[16]; 
     size_t i, j, size, count = 0; 
     /* 
     * Heading 
     */ 
     fputs(" ", stdout); /* skip address area */ 
     for (i = 0; i < sizeof data/sizeof *data; ++i) 
     { 
      printf("+%lX ", (long unsigned)i); 
     } 
     puts("Text"); 
     /* 
     * Body 
     */ 
     do { 
      /* Read some data. */ 
      size = fread(data, sizeof *data, sizeof data/sizeof *data, file); 
      if (size) 
      { 
       /* Print the base address. */ 
       printf("%08lX ", (long unsigned)count); 
       fprintf(fp,"%08lX",(long unsigned)count); 
       count += size; /* adjust the base address */ 
       /* Print the characters' hex values. */ 
       for (i = 0; i < size; ++i) 
       { 
        printf("%02X ", data[i]); 
        fprintf(fp1,"%02X",data[i]); 
       } 
       /* Pad the hex values area if necessary. */ 
       for (++i; i <= sizeof data/sizeof *data; ++i) 
       { 
        fputs(" ", stdout); 
       } 
       /* Print the characters (use '.' for non-printing characters). */ 
       /*  for (j = 0; j < size; j++) 
         { 
         putchar(isprint(data[j]) ? data[j] : '.'); 
         }*/ 
       putchar('\n'); 
      } 
     } while (size == sizeof data/sizeof *data); /* Break on partial count. */ 
     return count; 
    } 

    int main(void) 
    { 
     char filename[20] ;/* may not work on everywhere */ 
     char filename1[20]; 
     char filename2[20]; 
     printf("enter the filename\n"); 
     scanf("%s",filename); 
     printf("enter the filename to store address\n"); 
     scanf("%s",filename1); 
     printf("enter the filename to store data\n"); 
     scanf("%s",filename2); 
     FILE *file = fopen(filename, "rb"); 
     FILE *fp= fopen(filename1,"wb"); 
     FILE *fp1=fopen(filename2,"rb"); 
     if (file != NULL) 
     { 
      printf("%lu bytes\n", (long unsigned)hexdump(file,fp,fp1)); 
      fclose(file); 
      fclose(fp); 
      fclose(fp1); 
     } 
     else 
     { 
      perror(filename); 
     } 
     return 0; 
    } 

上記のコードを実行すると、セグメント化エラーが発生します。出力は次のとおりです。データ処理コードのセグメント化エラー

+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F Text 
Segmentation fault 

これはどうしてですか?

+0

sizeof data/sizeof * data?のインスタンスでは、特にfreadとforループで何を達成しようとしていますか? – JimR

+0

コードブロックが2つに分割され、最初に空白行がたくさんあるので、あなたの質問には少し編集すればよいでしょう。 –

+0

この宿題はありますか? – AlastairG

答えて

1
FILE *fp1=fopen(filename2,"rb"); 

読み取りのためにfp1を開きます。しかしあなたはそれに書きます。

まず
FILE *fp1=fopen(filename2,"wb"); 
+0

クラッシュした場合は、前の 'printf()'ステートメントの出力が表示されます。まあまあ同じように見つかった。 – AlastairG

0

に変更し、sizeof(a)ではなくsizeof aとしてはsizeofを使用するのが一般的です。実際、私はあなたが括弧なしでsizeofを使用することさえできることを理解していませんでした。

第2に、私はsizeofの優先順位を知らないので、結果が何であるかわからない。sizeof data/sizeof *data。代わりにsizeof(data)/sizeof(*data)を実行してください。それはsizeof(data/sizeof(*data))と解釈される可能性があります。私はそれがそうではないと思うが、いずれにしてもそれはすべて読みやすくなり、良い習慣である。

最後に、fpがNULLでないことを確認しますか?あなたは入力パラメータをチェックしていないので、NULLでないという保証はなく、もしNULLであれば、正確にどこにあるのか分かりません。

+0

'sizeof'は他の単項接頭演算子と同じ優先度を持ち、乗算、除算、モジュラスの直前、後置インクリメント/デクリメント、メンバ選択、配列インデックス、関数呼び出しの下にあります。 'sizeof x/sizeof x [0]'はCの配列のサイズを計算するための一般的なイディオムですので、それは問題ではありません。 –

関連する問題