CSC231 dumpScore.py

From dftwiki3
Revision as of 08:54, 11 December 2008 by Thiebaut (talk | contribs) (New page: --~~~~ ---- <code><pre> #! /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 littl...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

--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 )