fopen_s

fopen, fopen_s

在头文件中定义
(1)
FILE * fopen(const char * filename,const char * mode);(直到C99)
FILE * fopen(const char *限制文件名,const char *限制模式);(自C99以来)
errno_t fopen_s(FILE * restrict *限制streamptr,const char *限制文件名,const char *限制模式);(2)(自C11以来)

1)打开由该文件指示的文件filename并返回指向与该文件关联的文件流的指针。mode用于确定文件访问模式。

2)与(1)相同,除了写入指向文件流的指针streamptr以及在运行时检测到以下错误并调用当前安装的约束处理函数:

  • streamptr 是一个空指针

作为所有边界检查函数,fopen_s只有在被__STDC_LIB_EXT1__实现定义__STDC_WANT_LIB_EXT1__并且1在包含之前用户定义为整数常量时才能保证可用<stdio.h>。

参数

文件名-将文件流关联到的文件名
模式-文件存取模式文件存取模式字符串含义说明如果文件已存在,则采取行动如果文件不存在则执行“r”读取打开读取文件读取从开始失败读取打开“w”写入创建写入文件破坏内容创建新的“a”追加追加到文件写入结束创建新的“r +”读取扩展打开文件进行读取/写入从启动错误读取“w +”写入扩展创建读取/写入文件销毁内容创建新的“ a +“append extended打开一个文件进行读/写写操作以结束创建新的文件访问模式标志”b“可以选择性地指定在二进制模式下打开一个文件。该标志只对Windows系统有效。在附加文件访问模式下,无论文件位置指示符的当前位置如何,数据都会写入文件末尾。当以更新模式('+'作为上述模式参数值列表中的第二个或第三个字符)打开文件时,可以在关联的流上执行输入和输出。然而,输出不应直接跟随输入,而不需要对fflush函数或文件定位函数(fseek,fsetpos或rewind)进行干预调用,并且输入不应直接跟随输出,而不需要中间调用文件定位函数,除非输入操作遇到文件结束。在某些实现中打开(或创建)具有更新模式的文本文件可能会打开(或创建)二进制流。文件访问模式标志“x” 可以选择性地附加到“w”或“w +”说明符。如果文件存在,该标志强制该功能失败,而不是覆盖它。(C11)使用fopen_s或freopen_s时,用“w”或“a”创建的任何文件的文件访问权限会阻止其他用户访问它。文件访问模式标志“u”可以有选择地添加到以“w”或“a”开头的任何说明符中,以启用默认的fopen权限。(C11)可以有选择地添加到以“w”或“a”开头的任何说明符中,以启用默认的fopen权限。(C11)可以有选择地添加到以“w”或“a”开头的任何说明符中,以启用默认的fopen权限。(C11)
文件访问模式字符串含义说明
“R”打开一个文件以供阅读
“W”创建一个文件写入
“一个”附加附加到文件
“R +”阅读扩展打开文件进行读取/写入
“W +”写入扩展创建一个用于读/写的文件
“A +”追加扩展打开文件进行读取/写入

| 可以选择指定文件访问模式标志“b”以二进制模式打开文件。该标志只对Windows系统有效。在附加文件访问模式下,无论文件位置指示符的当前位置如何,数据都会写入文件末尾。|

| 当以更新模式('+'作为上述模式参数值列表中的第二个或第三个字符)打开文件时,可以在关联的流上执行输入和输出。然而,输出不应直接跟随输入而没有插入调用fflush函数或文件定位函数(fseek,fsetpos,或倒带),并且输入不应直接跟随输出而没有中间呼叫到一个文件中的定位函数,除非输入操作遇到文件结束。在某些实现中打开(或创建)具有更新模式的文本文件可能会打开(或创建)二进制流。|

| 文件访问模式标志“x”可以选择性地附加到“w”或“w +”说明符。如果文件存在,该标志强制该功能失败,而不是覆盖它。(C11)|

| 当使用fopen_s或freopen_s时,用“w”或“a”创建的任何文件的文件访问权限会阻止其他用户访问它。文件访问模式标志“u”可以有选择地添加到以“w”或“a”开头的任何说明符中,以启用默认的fopen权限。(C11)|

| streamptr | - | 指向函数存储结果的指针(out-parameter)|的指针

返回值

1)如果成功,返回一个指向新文件流的指针。除非filename指向交互式设备,否则该流完全缓冲。出错时,返回一个null pointer。POSIX需要的是errno在这种情况下设置。

2)如果成功,则返回零,并写入指向新文件流的指针*streamptr。出错时,返回一个非零的错误代码并将空指针写入*streamptr(除非streamptr是空指针本身)。

注意

格式filename是实现定义的,并不一定是指文件(例如它可能是控制台或通过文件系统API可访问的其他设备)。在支持它们的平台上,filename可能包括绝对或相对的文件系统路径。

#include <stdio.h> #include <stdlib.h> int main(void) { FILE* fp = fopen("test.txt", "r" if(!fp) { perror("File opening failed" return EXIT_FAILURE; } int c; // note: int, not char, required to handle EOF while ((c = fgetc(fp)) != EOF) { // standard C I/O file reading loop putchar(c } if (ferror(fp)) puts("I/O error when reading" else if (feof(fp)) puts("End of file reached successfully" fclose(fp }

参考

  • C11标准(ISO / IEC 9899:2011):