对于 fopen 模式,请参阅http://www.cplusplus.com/reference/cstdio/fopen/。我认为您需要使用该选项r+
,因为您正在以随机访问方式修改文件以进行读写。
"r+" 读取/更新:打开一个文件进行更新(输入和输出)。该文件必须存在。
"w+" 写入/更新:创建一个空文件并打开它进行更新(输入和输出)。如果已存在同名文件,则丢弃其内容并将该文件视为新的空文件。
"a+" 追加/更新:打开一个文件进行更新(输入和输出),所有输出操作都在文件末尾写入数据。重新定位操作(fseek、fsetpos、rewind)会影响下一个输入操作,但输出操作会将位置移回文件末尾。如果文件不存在,则创建该文件。
我建议将文件中的行数存储为无符号整数而不是字符串。原因是作为字符串,0-9 行占用一个字节,但是当您有 10 行时,您需要两个字节、100、3 个字节等等。在需要额外字符的每种情况下,您都必须重新编写整个文件。我想这就是为什么您检查分数少于 10 的原因。
更好的解决方案是将文件的前 4 个字节保留为无符号整数,然后再启动 ascii 文本。
int result;
uint32_t number_of_scores;
size_t bytesRead;
FILE *data;
...
/* Open a file for update (both for input and output).
* The file must exist. */
data = fopen("highscore.txt","r+");
if( !data )
exit(SOME_ERROR_CODE);
/* Read a 32-bit unsigned integer from the file. NOTE there is no endianess
* "protection" here... ignoring this issue for the sake of simplicity and relevance */
bytesRead = fread (&number_of_scores, sizeof(number_of_scores), 1, data);
if( bytesRead != 1 )
exit(SOME_ERROR_CODE);
/* Seek to end of file */
result = fseek(data, 0, SEEK_END);
if( result )
exit(SOME_ERROR_CODE);
/* Write in the next line */
result = fprintf(data,
"%s %s %s %s\n",
user[current_user].name,
user[current_user].age,
user[current_user].college,
resultVariableRenamedToAvoidNameCollision);
/* Up the number of scores and write it back to the start of the file */
number_of_scores++;
result = fseek(data, 0, SEEK_SET);
if( result )
exit(SOME_ERROR_CODE);
bytesRead = fwrite (data, sizeof(number_of_scores), 1, data);
if( bytesRead != 1 )
exit(SOME_ERROR_CODE);
fclose(data);
Doh,我刚刚意识到这个答案有多晚......没关系:S