C++ is both more powerful and has easier to use constructs than C (because OO is built in, you don't have to labor for it). You can, of course, use OO in C, and you can write "C" programs in C++ (though all C code might not compile in C++ without adjustments).
If I were doing this in C, I would use a lower level file I/O such as fread/fwrite. Even though file I/O is byte oriented, I would use the model where you specify how many elements you want to read/write, along with the size of the element. I would then transfer the data, calculating the checksum as I went, and finish off the file with a transfer of the negative (or complement, depending on how you like it) of the checksum. I would then read it back in the same fashion, calculating the checksum as I went. The checksum would also be included in the calculation, so the final checksum value should be zero.
In C++, I would take a different tack. I would have a class or struct representing a score record for each person. This class or struct would have a method for computing its individual checksum, as well as a method (or friend) for outputting it to an output stream.
I would also have a class representing the file, which would be comprised of a vector of the individual score records. This class would have a method for accumulating the individual checksum, a method for calling the output of all the members of the vector, and finish up with an output of the inverse of the accumulated checksum.
The input mechanism would just do all this chit in reverse and indicate success or failure, based on the checksum results.
Please understand that a checksum/crc is not a method of encryption. It merely offers a good probability (not 1.0 by any means) that the information was recovered without error or modification. Any reasonably proficient person can modify the file and defeat it.