函数
<cstdio>

fopen

FILE * fopen ( const char * filename, const char * mode );
打开文件
打开参数 filename 中指定的函数,并将其与一个流关联,该流可在后续操作中通过返回的 FILE 指针进行标识。

允许对流进行的操作以及如何执行这些操作由 mode 参数定义。

如果返回的流已知不指向交互式设备,则默认情况下它将是 *fully buffered* (参见 setbuf)。

返回的指针可以通过调用 fclosefreopen 来解除与文件的关联。所有打开的文件在程序正常终止时都会自动关闭。

运行环境同时支持至少 FOPEN_MAX 个打开的文件。

参数

filename
包含要打开的文件名的 C 字符串。
其值应遵循运行环境的文件名规范,并可以包含路径(如果系统支持)。
mode
包含文件访问模式的 C 字符串。它可以是
"r"读取:为输入操作打开文件。文件必须存在。
"w"写入:创建一个空文件用于输出操作。如果同名的文件已存在,则其内容将被丢弃,文件将被视为一个新的空文件。
"a"追加:在文件末尾打开文件进行输出。输出操作始终在文件末尾写入数据,并扩展文件。定位操作(fseekfsetposrewind)将被忽略。如果文件不存在,则会创建文件。
"r+"读/更新:为更新(输入和输出)打开文件。文件必须存在。
"w+"写/更新:创建一个空文件并为更新(输入和输出)打开它。如果同名的文件已存在,则其内容将被丢弃,文件将被视为一个新的空文件。
"a+"追加/更新:为更新(输入和输出)打开文件,所有输出操作都会在文件末尾写入数据。定位操作(fseekfsetposrewind)会影响下一个输入操作,但输出操作会将位置移回文件末尾。如果文件不存在,则会创建文件。
使用上述 mode 说明符,文件将以 *text file* 的方式打开。为了以 *binary file* 的方式打开文件,需要在 mode 字符串中包含一个"b"字符。这个附加的"b"字符可以附加在字符串的末尾(从而形成以下组合模式:“rb”、“wb”、“ab”、“r+b”、“w+b”、“a+b”),或者插入在混合模式的字母和"+"符号之间(“rb+”、“wb+”、“ab+”)。

新的 C 标准(C2011,不是 C++ 的一部分)添加了一个新的标准子说明符("x"),可以附加到任何"w"说明符(形成"wx", "wbx", "w+x""w+bx"/"wb+x")。该子说明符强制函数在文件存在时失败,而不是覆盖它。

如果序列后跟附加字符,则行为取决于库实现:某些实现可能会忽略附加字符,以便接受例如附加的"t"(有时用于明确表示 *text file*)。

在某些库实现中,以更新模式打开或创建文本文件可能会将流视为二进制文件。

*Text files* 是包含文本行序列的文件。根据应用程序运行的环境,在 *text mode* 下进行输入/输出操作时可能会发生一些特殊的字符转换,以使其适应系统特定的文本文件格式。虽然在某些环境中不会发生转换,并且 *text files* 和 *binary files* 的处理方式相同,但使用适当的模式可以提高可移植性。

对于以更新模式打开的文件(包含"+"符号),允许进行输入和输出操作,在读取操作之前(该读取操作紧跟在写入操作之后)应刷新流(fflush)或重新定位流(fseekfsetposrewind)。在写入操作之前(该写入操作紧跟在读取操作之后,并且该读取操作未到达文件末尾)应重新定位流(fseekfsetposrewind)。

返回值

如果文件成功打开,该函数将返回一个指向 FILE 对象的指针,该指针可用于在后续操作中标识该流。
否则,将返回一个空指针。
在大多数库实现中,失败时还会将 errno 变量设置为一个特定于系统的错误代码。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
/* fopen example */
#include <stdio.h>
int main ()
{
  FILE * pFile;
  pFile = fopen ("myfile.txt","w");
  if (pFile!=NULL)
  {
    fputs ("fopen example",pFile);
    fclose (pFile);
  }
  return 0;
}

另见