c-fopen中的r+和a+之间有什么区别



我不明白c中fopen中的r+和a+之间的实际区别是什么。有人能帮我吗?

r+将打开一个文件进行读写。如果文件不存在,它将失败。fseek可以用于读取和写入文件中的任何位置。

w+将打开一个用于读取和写入的文件。如果文件不存在,它将创建该文件,如果文件存在,则销毁并重新创建该文件。fseek可用于读取文件中的任何位置。

a+将打开一个用于读取和写入的文件。如果文件不存在,它将创建该文件。fseek可用于读取文件中的任何位置,但无论对fseek的任何调用如何,写入都将始终追加到文件的末尾

摘自fopen手册页

  • r打开文本文件进行读取。溪流位于文件的开头。

  • r+开放阅读和写作。溪流位于文件的开头。

  • w将文件截断为零长度或创建文本文件进行写入。流位于文件的开头。

  • w+开放阅读和写作。如果创建了文件不存在,否则将被截断。流是位于文件开头。

  • a打开以进行追加(在文件末尾写入(。文件是如果不存在则创建。溪流位于文件末尾。

  • a+打开以进行读取和追加(在文件末尾写入(。这个若文件不存在,则创建该文件。初始文件读取位置在文件的开头,但是输出总是附加到文件的末尾。

我决定举一个例子供将来参考。首先,FILE*fp将是指向流的指针,而不是硬盘中文件的实际数据。因此,当fopen被调用时,它是在流上调用的,而不是在文件上调用的。请记住,一个文件可以有多个流。这里的+(b也可以接受,即r+==rb(只是一个"更新"。这与系统在文件中的写入方式有关。如果数据被整体擦除和写入,或者只更改更改的数据,则可以写入文件。例如,如果我们需要将"Today is monday"更新为"Today is monday",我们可以清除该句子并重新编写。但如果我们更新,我们只需将o更改为o,将n更改为n,将a更改为a,将y更改为y,将m更改为m。

对于实际的示例,让我们假设我们有一个空文件,并调用(我有完整的代码,以防你想拿它来测试自己(

int main() {
    FILE * fp;
    if(fp==NULL)
    {
        return -1;
    }
    fp = fopen("file.txt", "r+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10001);
    fflush(fp);
    fclose(fp);
    fp = fopen("file.txt", "r+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10002);
    fflush(fp);
    fclose(fp);
    fp = fopen("file.txt", "r+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10003);
    fflush(fp);
    fclose(fp);
    return(0);
}

这个问题已经在这里回答了

这将给我们一个文件,如:

这是测试票10003

这是正常的,因为第一个调用写入了

这是测试票10001

第二个调用将1更改为2,第三个调用将2更改为3。现在,如果我们更改这3个fopen调用,如:

    fp = fopen("file.txt", "a+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10001);
    fflush(fp);
    fclose(fp);
    fp = fopen("file.txt", "a+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10002);
    fflush(fp);
    fclose(fp);
    fp = fopen("file.txt", "a+");
    fprintf(fp, "%s %s %s %d", "This", " is ", "test ticket ", 10003);
    fflush(fp);
    fclose(fp);

我们将获得

这是测试票10001这是测试券10002这是测试票10003

作为每个追加的调用。

另一参考www.cplusplus.com

  • "r" read:打开文件进行输入操作。文件必须存在
  • "w"写入:为输出操作创建一个空文件。如果具有相同名称的文件已经存在,则会丢弃其内容,并将该文件视为新的空文件
  • "a" append:打开文件以在文件末尾输出。输出操作总是在文件的末尾写入数据,并将其展开。重新定位操作(fseek、fsetpos、reback(将被忽略。如果文件不存在,则会创建该文件
  • "r+"读取/更新:打开一个文件进行更新(用于输入和输出(。文件必须存在
  • "w+"写入/更新:创建一个空文件并打开它进行更新(用于输入和输出(。如果具有相同名称的文件已经存在,则会丢弃其内容,并将该文件视为新的空文件
  • "a+" append/update:打开一个文件进行更新(包括输入和输出(,所有输出操作都在文件末尾写入数据。重新定位操作(fseek、fsetpos、reback(会影响下一个输入操作,但输出操作会将位置移回文件末尾。如果文件不存在,则会创建该文件

最新更新