Getting ready
Create a directory csci235/clab1 and store copies of the following files in that directory.
Let’s Take a moment while you try out the first three options listed on the very long gcc man page. Notice what each option produces.
Next take a look at the Makefile. It really can be that simple. However, just to make it a little more challenging, modify Makefile so that it will store the executable in csort rather than labstuff. I think this involves changing only one line.
Task 1 — reading and printing
Take a look at your files and figure out how to get your program to read and neatly print the information in course.txt. Hint: Look for the four strings than need filling in.
This does involve a serious look at
fscanf()
and
fprintf()
.
Your program’s output must be displayed in neat lines.
Also, pay attention to that
struct courseInfo
definition. Remember, a struct
is like
a class with no methods.
Task 2 — sorting with void *
Take a look at the
qsort()
routine. Then look at the
Microsoft Developer Network (MDN)
example (and any other examples you can find) because the official description won’t be
that useful.
Start the following incomplete routine.
int cmpLimit(const void *a, const void *b) { struct courseInfo *c1 = (struct courseInfo *)a ; struct courseInfo *c2 = (struct courseInfo *)b ; return your magic ; }
Now add a line to call qsort
to sort the array by
course limit size.
Be sure to print the array after sorting so we can be sure it really has been sorted.
Task 3 — a better sort
Improve cmpLimit
so that it breaks ties by
department name, course number, and finally section number.
Students who have taken CSCI 333 may have a slight advantage here.
Use strncmp()
to comparse the department names.
This one is a quite messy. My cmpLimit()
is about
a dozen lines.
Task 4 — Raw bits
Modify your program so that it writes a binary file. You really can’t look at a binary text file in a normal editor, but there are a surprizingly large number of hex editors for Linux. Look up the page Best Linux Hex Editors to see a listing. If we have time, you can try one out at the end of the lab. (A former CSCI 202 instructor required his students to learn how use a hex editor.)
Start by adding some code to allow the “user” of your program
to specify a name for the binary output file on the command line.
(Hint: Use argv[2]
as the first argument to fopen
.)
Be sure to check the return value of
your new fopen()
: It better not be NULL
.
Also, expert C programmers call
strerror()
to generate a nice error message.
You also need to
call fwrite
to
populate your binary file.
It’s actually easier than using fprintf
.
If we have time,
look at your binary file using your favorite editor or
just more it.
Binary files are not made for human reading.
I often just use od.
Read Linux OD command Examples page. (Hint: -c
and
-x
.)
The output file produced by your program should be 340 bytes long and have a checksum (as computed by cksum) of 350993223.
Task 5 — Direct I/O for binary
Finally, we are going to write a program that reads a record from the binary file. This program will be called, from the shell, as follows:
readrec binaryFileName recordNumber
This program isn’t that long. However, it needs to call the following routines to read the record.
I used
scanf()
to parse the record number.
If you are really serious about error checking, try
strtol()
.
You’ll probably need to follow along in class for this one.