All pastes #976506 Raw Edit

Stuff

public text v1 · immutable
·published 2008-04-08 06:28 UTC
rendered paste body
/*
 * binread.c
 * ENCM 369 Winter 2006 Lab 11 Exercise A
 */

#include <stdio.h>
#include <stdlib.h>

#define MAX_ELEMENTS 1024

unsigned 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;
}