fopen, fopen_s

来自cppreference.com
< c‎ | io
 
 
 
在标头 <stdio.h> 定义
(1)
FILE*fopen(constchar*filename, constchar*mode );
(C99 前)
FILE*fopen(constchar*restrict filename, constchar*restrict mode );
(C99 起)
errno_t fopen_s(FILE*restrict*restrict streamptr,

                 constchar*restrict filename,

                 constchar*restrict mode );
(2) (C11 起)
1) 打开 filename 所指示的文件,并返回指向关联到该文件的文件流的指针。 mode 用于确定文件访问模式。
2)(1),除了指向文件流的指针被写入 streamptr ,还在运行时检测下列错误,并调用当前安装的约束处理函数:
  • streamptr 是空指针
  • filename 是空指针
  • mode 是空指针

同所有边界检查函数,fopen_s,仅若实现定义 __STDC_LIB_EXT1__ 且用户在包含 <stdio.h> 前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。

目录

[编辑]参数

filename - 关联到文件系统的文件名
mode - 确定访问模式的空终止字符串文件访问模式
streamptr - 指向存储函数结果的指针的指针(输出参数)

[编辑]文件访问标记

文件访问
模式字符串
含义 解释 若文件已存在的动作 若文件不存在的动作
"r" 打开文件以读取 从头读 打开失败
"w" 创建文件以写入 销毁内容 创建新文件
"a" 后附 后附到文件 写到结尾 创建新文件
"r+" 读扩展 打开文件以读/写 从头读 错误
"w+" 写扩展 创建文件以读/写 销毁内容 创建新文件
"a+" 后附扩展 打开文件以读/写 写到结尾 创建新文件
可以可选地指定文件访问模式标记 "b" 来以二进制模式打开文件。此标在 POSIX 上没有效果,而在 Windows 系统上,它禁用了对 '\n''\x1A' 特殊处理。
在附加文件访问模式下,数据被写入到文件尾,而不考虑文件位置指示器的当前位置。
如果模式不是以上所列字符串之一,则其行为未定义。一些实现会定义额外支持的模式(比如 Windows)。
在更新模式('+')中,输入和输出均可进行,然而输出不应直接紧随输入,而中间无对 fflushfseekfsetposrewind 的调用,且输入不应直接紧随输出,而中间无对 fseekfsetposrewind 的调用,除非输入操作遇到文件尾。在更新模式中,允许各实现在即便指定了文本模式时仍使用二进制模式。
文件访问模式标记 "x" 可以可选地后附于 "w""w+" 指定符。若文件存在,则此标记强制函数失败,而不重写它。(C11)
使用 fopen_sfreopen_s 时,任何以 "w""a" 创建的文件的文件访问许可均禁止其他用户访问它。文件访问模式标签 "u" 可以可选地前附于任何以 "w""a" 开始的指定符,以启用默认的 fopen 许可。(C11)

[编辑]返回值

1) 若成功,则返回指向新文件流的指针。流为完全缓冲,除非 filename 表示一个交互设备。错误时,返回空指针。 POSIX 要求此情况下必须设置 errno
2) 若成功,则返回零并将新文件流指针写入 *streamptr 。错误时,返回非零错误码并将空指针写入 *streamptr (除非 streamptr 自身也是空指针)。

[编辑]注意

filename 的格式是实现定义的,而且不需要表示一个文件(譬如可以是控制台或另一能通过文件系统 API 访问的设备)。在支持的平台上, filename 可以包含绝对或相对路径。

[编辑]示例

#include <stdio.h>#include <stdlib.h>   int main(void){constchar* fname ="/tmp/unique_name.txt";// 或 tmpnam(NULL);int is_ok =EXIT_FAILURE;   FILE* fp = fopen(fname, "w+");if(!fp){perror("File opening failed");return is_ok;}fputs("Hello, world!\n", fp);rewind(fp);   int c;// 注意:为处理 EOF 需要 int 而非 charwhile((c =fgetc(fp))!=EOF)// 标准 C 的 I/O 文件读取循环putchar(c);   if(ferror(fp))puts("读取时发生 I/O 错误");elseif(feof(fp)){puts("成功抵达文件末尾"); is_ok =EXIT_SUCCESS;}   fclose(fp);remove(fname);return is_ok;}

可能的输出:

Hello, world! 成功抵达文件末尾

[编辑]引用

  • C17 标准(ISO/IEC 9899:2018):
  • 7.21.5.3 The fopen function (第 223-224 页)
  • K.3.5.2.1 The fopen_s function (第 428-429 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.21.5.3 The fopen function (第 305-306 页)
  • K.3.5.2.1 The fopen_s function (第 588-590 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.19.5.3 The fopen function (第 271-272 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.9.5.3 The fopen function

[编辑]参阅

关闭文件
(函数)[编辑]
将输出流与实际文件同步
(函数)[编辑]
以不同名称打开既存的文件流
(函数)[编辑]
fopen 的 C++ 文档
close