【问题标题】:What is the difference between r+ and a+ in fopen?fopen中的r+和a+有什么区别?
【发布时间】:2018-11-13 16:08:28
【问题描述】:

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

【问题讨论】:

标签: c file io


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    取自 fopen man page

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

    • r+ 可读写。流位于 文件的开头。

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

    • w+ 可读写。如果有,则创建该文件 不存在,否则被截断。流是 位于文件的开头。

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

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

    我决定举一个例子以供将来参考。首先 FILE* fp 将是一个指向流的指针,而不是硬盘中文件的实际数据。所以当 fopen 被调用时,它是在一个流,而不是文件。请记住,一个文件可以有多个流。 什么 + 是(b 在这里也可以接受,即 r+ == rb)在这里,只是一个“更新”。这与系统写入文件的方式有关。如果数据擦除和写入,则可以写入文件作为一个整体,或者只更改已更改的数据。例如,如果我们需要将“今天是星期一”更新为“今天是星期一”,我们要么清除句子并重新编写它。但如果我们更新,我们只需将 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);
    }
    

    这个问题也已经回答here

    这会给我们一个类似的文件:

    这是测试票 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

    作为附加的每个调用。

    【讨论】:

      【解决方案3】:

      另一个参考www.cplusplus.com

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

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        相关资源
        最近更新 更多