ошибка сегментации в коде обработки данных - PullRequest
1 голос
/ 07 января 2011
#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

В чем может быть причина этого?

Ответы [ 2 ]

1 голос
/ 07 января 2011
FILE *fp1=fopen(filename2,"rb");

Вы открываете fp1 для чтения.Все же ты пишешь в него.Измените его на

FILE *fp1=fopen(filename2,"wb");
0 голосов
/ 07 января 2011

Во-первых, обычно используется sizeof как sizeof(a) вместо sizeof a. На самом деле я не понимал, что вы можете использовать sizeof без скобок.

Во-вторых, я не знаю о приоритете sizeof, поэтому не знаю, какой результат даст sizeof data / sizeof *data. Попробуйте вместо этого сделать sizeof(data)/sizeof(*data). Это может быть истолковано как sizeof(data/sizeof(*data)). Я подозреваю, что это не так, но в любом случае это делает все это более читабельным и является хорошей практикой.

Наконец, вы уверены, что fp не NULL? Вы не проверяете свои входные параметры (это всегда хорошая идея), поэтому нет гарантии, что это не NULL, а если это NULL, вы получите segfault именно там, где вы, кажется, получаете его.

...