C r+;和a+;在福彭?

C r+;和a+;在福彭?,c,file,io,C,File,Io,我不明白c中fopen中r+和a+的实际区别是什么。有人能帮我吗?r+将打开一个文件进行读写。如果文件不存在,它将失败fseek可用于读取和写入文件中的任何位置 w+将打开一个文件进行读写。如果文件不存在,它将创建该文件;如果文件确实存在,它将销毁并重新创建该文件fseek可用于读取文件中的任何位置 a+将打开一个文件进行读写。如果文件不存在,它将创建该文件fseek可用于读取文件中的任何位置,但无论对fseek进行任何调用,写入操作都将始终附加到文件的末尾 r打开文本文件进行阅读。该流位于

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

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

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

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

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

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

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

  • w+打开阅读和写作。如果创建了该文件,则会创建该文件 不存在,否则将被截断。这条小溪很深 位于文件的开头

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

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

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

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

这个问题也已经回答了

这将为我们提供一个如下文件:

这是考试票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);
我们会得到

这是测试票这是测试票这是 测试票10003

每一个调用都会附加一个引用

  • “r”
    读取:打开文件进行输入操作。该文件必须存在
  • “w”
    写入:为输出操作创建一个空文件。如果已存在同名文件,则会丢弃其内容,并将该文件视为新的空文件
  • “a”
    附加:打开文件以在文件末尾输出。输出操作总是在文件末尾写入数据,并将其展开。忽略重新定位操作(fseek、fsetpos、倒带)。如果文件不存在,则创建该文件
  • “r+”
    读取/更新:打开文件进行更新(输入和输出)。该文件必须存在
  • “w+”
    写入/更新:创建一个空文件并打开它进行更新(用于输入和输出)。如果已存在同名文件,则丢弃其内容,并将该文件视为新的空文件
  • “a+”
    追加/更新:打开一个文件进行更新(输入和输出),所有输出操作都在文件末尾写入数据。重新定位操作(fseek、fsetpos、rewind)会影响下一个输入操作,但输出操作会将位置移回文件末尾。如果文件不存在,则创建该文件
    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);