我不明白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(会影响下一个输入操作,但输出操作会将位置移回文件末尾。如果文件不存在,则会创建该文件