All pastes #976509 Raw Edit

Untitled

public c v1 · immutable
·published 2008-04-08 06:30 UTC
rendered paste body
/* * binread.c * ENCM 369 Winter 2006 Lab 11 Exercise A */#include <stdio.h>#include <stdlib.h>#define MAX_ELEMENTS 1024unsigned int input_data[MAX_ELEMENTS];unsigned int input_temp[MAX_ELEMENTS];int main(int argc, char **argv){  unsigned int size_from_file;  unsigned int how_many_read;  FILE *fp;  unsigned int i;    unsigned int j;  unsigned int temp = 0;  unsigned int b = 0;    if (argc != 2) {    fprintf(stderr, "syntax for command should be: %s filename\n", argv[0]);    exit(1);  }  /* The mode "rb" means read a binary file.  The "b" is   * not necessary in Linux systems, but is needed in   * MS Windows and various other OSes. */  if ((fp = fopen(argv[1], "rb")) == NULL) {    fprintf(stderr, "failed to open file %s for input\n", argv[1]);    exit(1);  }  printf("\nAttempting to read array stored in %s ...\n", argv[1]);    how_many_read = fread(&size_from_file, sizeof(unsigned int), 1, fp);    /*Conversion to correct endian-ness.*/  printf("Size_from_file = %u\n", size_from_file);    b = size_from_file & 0x000000ff;  b = b << 24;  temp  = temp | b;  b = size_from_file & 0x0000ff00;  b = b << 8;  temp = temp | b;  b = size_from_file & 0x00ff0000;  b = b >> 8;  temp = temp | b;  b = size_from_file & 0xff000000;  b = b >> 24;  temp = temp | b;  size_from_file = temp;  printf("Size_from_file is now = %u\n", size_from_file);     if (how_many_read != 1) {    fprintf(stderr,             "Not enough bytes in %s to form an element count.\n",            argv[1]);    exit(1);  }  printf("Number of elements stated in file: %u\n",size_from_file );  if (size_from_file > MAX_ELEMENTS) {    fprintf(stderr,             "This program can't handle an array of over %u elements.\n",            (unsigned int) MAX_ELEMENTS);    exit(1);  }  how_many_read = fread(input_data, sizeof(unsigned int), size_from_file, fp);  if (how_many_read != size_from_file) {    fprintf(stderr,             "Read error occurred before %u elements could be read from %s.\n",            size_from_file,            argv[1]);    exit(1);  }  /* We created this for loop instead of reusing the printf one below */  /* It seems more clear for us to use a temp array rather than */  /* directly copying from left to right into the correct positions. */  /* It may be wasteful but this section is much easily adapted to print */  /* for the other endian-ness. */  for(j = 0; j < size_from_file; j++)    {      b = input_data[j] & 0x000000ff;      b = b << 24;      input_temp[j] = input_temp[j] | b;      b = input_data[j] & 0x0000ff00;      b = b << 8;      input_temp[j] = input_temp[j] | b;      b = input_data[j] & 0x00ff0000;      b = b >> 8;      input_temp[j] = input_temp[j] | b;      b = input_data[j] & 0xff000000;      b = b >> 24;      input_temp[j] = input_temp[j] | b;    }  for (i = 0; i < size_from_file; i++)    printf("Element %d: %u\n", i, input_temp[i]); /*Change to input_data[i] for other endian case*/  if (fclose(fp) != 0) {    fprintf(stderr,            "Error detected closing %s; something weird happened.\n",            argv[1]);    exit(1);  }  return 0;}