2

我在用 C 语言编辑文件的特定行时遇到问题。文件开头有一个数字,后面跟着几行。它看起来像这样。

2
Nasif  20  BUET  130
Oishi  24  KMC  131

每次执行后,我在文件中再追加一行。并且文件中的第一个数字(实际上表示行数)增加了 1。这个过程似乎不起作用。

data=fopen("highscore.txt","r");
fscanf(data,"%d",&number_of_scores);
fclose(data);
if(number_of_scores<10){
    data=fopen("highscore.txt","a");
    fprintf(data,"%s  %s  %s  %s\n", user[current_user].name,
            user[current_user].age, user[current_user].college,result);
    number_of_scores++;
    fseek(data,0,0);
    fprintf(data,"%d",number_of_scores);
    fclose(data);
}
else{

}

那么,正确的方法应该是什么?

4

4 回答 4

2

您需要以读写模式 ( "r+") 打开文件,而不是附加 ( "a")。最初,写入位置将位于开头,因此您不妨先更新行数。然后你可以fseek(data, 0, SEEK_END)在添加新行之前。

于 2013-05-30T15:56:04.837 回答
2

对于 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

于 2013-05-30T16:41:39.633 回答
0

尝试在第二次通话 时将其替换"a"为。用于在文件末尾附加信息。=) "w+"fopen()"a"

编辑:但是我也会用一些固定的空格填充写入的数字,否则,由于当前编写的代码,当计数超过 9 时,您可能会覆盖第一行的行尾标记。

于 2013-05-30T15:49:20.540 回答
0
  1. 无需多次打开文件。
  2. 需要寻找文件指针的准确点。
  3. 如果必须读取文件中的数据,则必须以读取模式打开文件。
于 2013-05-30T15:55:55.100 回答