fopen 中 r+ 和 a+ 的区别是什么?

4
我不太清楚在C语言的fopen中,r+和a+有什么实际区别。能有人帮帮我吗?

https://dev59.com/eWEi5IYBdhLWcg3wndVv#58419418 - Sathvik
3个回答

6

r+打开一个文件进行读写操作,如果文件不存在则会失败。 fseek 可以用于在文件中的任何位置进行读写。

w+打开一个文件进行读写操作。如果文件不存在,则会创建该文件,并且如果文件已经存在,则会销毁并重新创建该文件。 fseek 可以用于在文件中的任何位置进行读取。

a+打开一个文件进行读写操作。如果文件不存在,则会创建该文件。 fseek 可以用于在文件中的任何位置进行读取,但是不管调用了多少次fseek,写入操作始终会附加到文件末尾。


4

这段文字摘自 fopen man 页面

  • 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);
}

这个问题已经在这里得到了回答。

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

This is test ticket 10003

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

This is test ticket 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

每个调用都会追加。


0

又一个参考 www.cplusplus.com

  • "r" 读取:打开文件进行输入操作。文件必须存在。
  • "w" 写入:创建一个空文件进行输出操作。如果同名文件已经存在,其内容将被丢弃并将该文件视为新的空文件。
  • "a" 追加:在文件末尾打开文件进行输出操作。输出操作总是在文件末尾写入数据,扩展文件大小。重新定位操作(fseek、fsetpos、rewind)将被忽略。如果文件不存在,则创建该文件。
  • "r+" 读取/更新:打开文件进行读取和更新操作。文件必须存在。
  • "w+" 写入/更新:创建一个空文件并打开它进行读取和更新操作。如果同名文件已经存在,其内容将被丢弃并将该文件视为新的空文件。
  • "a+" 追加/更新:打开文件进行读取和更新操作,所有输出操作都写入文件末尾。重新定位操作(fseek、fsetpos、rewind)影响下一次输入操作,但输出操作将位置移回文件末尾。如果文件不存在,则创建该文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接