CSC231 dumpScore.py
--D. Thiebaut 13:54, 11 December 2008 (UTC)
#! /usr/bin/python
# dumpScores.py
# D. Thiebaut
# read binary file of scores where a score is represented by
# 3 ascii chars followed by a 4-byte integer in little-endian
# format.
# Syntax: dumpScore.py score_file_name message
#
import struct
import sys
def displayScoreFile( fileName="scores.dat", message="" ):
""" reads the score file, unpacks it, and displays it """
fmt = 'ccci' # format of the binary records
record_size = struct.calcsize( fmt ) # size of record
if len( message ):
print "-------------------------------------"
print " "* (len( message)/2),message
print "-------------------------------------"
smallestInitials="???" # id of smallest score
smallest = 99999999 # to be sure we catch the smallest
largestInitials = "???" # id of largest score
largest = -1 # to catch the largest
try:
file = open( fileName, "rb" ) # open file
except:
print "could not open file"
return
while True: # keep reading until the eof
block = file.read( 3 ) # read 3 bytes
if len( block )==0: # can't? then break
break
(i1,i2,i3 ) = struct.unpack( 'ccc', block )
block = file.read( 4 ) # unpack as 3 chars, read 4 bytes
if block is None: # can't? then break
break
score = struct.unpack( 'i', block )[0]
# unpack as a 32-bit int
if ( score > largest ): # find largest...
largest = score
largestInitials = i1+i2+i3
if ( score < smallest ): # and smallest...
smallest = score
smallestInitials = i1+i2+i3
print i1+i2+i3, score
print "-------------------------------------"
print "Smallest score: %s %d" % (smallestInitials, smallest)
print "Largest score: %s %d" % (largestInitials, largest)
print "-------------------------------------"
#--------------------------------------------------------------
# main program: gets the arguments, which should be the
# name of the score file followed by a message to be printed
# in the header of the display.
#--------------------------------------------------------------
argv = sys.argv
if len( argv ) == 1:
file = raw_input( "score file? " )
else:
file = argv[1]
if len( argv ) > 2:
msg = ' '.join( argv[2:] )
else:
msg = file
displayScoreFile( file, msg )