r+
打开一个文件进行读写操作,如果文件不存在则会失败。 fseek
可以用于在文件中的任何位置进行读写。
w+
打开一个文件进行读写操作。如果文件不存在,则会创建该文件,并且如果文件已经存在,则会销毁并重新创建该文件。 fseek
可以用于在文件中的任何位置进行读取。
a+
打开一个文件进行读写操作。如果文件不存在,则会创建该文件。 fseek
可以用于在文件中的任何位置进行读取,但是不管调用了多少次fseek
,写入操作始终会附加到文件末尾。
这段文字摘自 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
每个调用都会追加。
又一个参考 www.cplusplus.com
"r"
读取:打开文件进行输入操作。文件必须存在。"w"
写入:创建一个空文件进行输出操作。如果同名文件已经存在,其内容将被丢弃并将该文件视为新的空文件。"a"
追加:在文件末尾打开文件进行输出操作。输出操作总是在文件末尾写入数据,扩展文件大小。重新定位操作(fseek、fsetpos、rewind)将被忽略。如果文件不存在,则创建该文件。"r+"
读取/更新:打开文件进行读取和更新操作。文件必须存在。"w+"
写入/更新:创建一个空文件并打开它进行读取和更新操作。如果同名文件已经存在,其内容将被丢弃并将该文件视为新的空文件。"a+"
追加/更新:打开文件进行读取和更新操作,所有输出操作都写入文件末尾。重新定位操作(fseek、fsetpos、rewind)影响下一次输入操作,但输出操作将位置移回文件末尾。如果文件不存在,则创建该文件。