fopen, fopen_s

来自cppreference.com
< c‎ | io
 
 
文件输入/输出
函数
文件访问
fopenfopen_s

(C11)
(C95)
直接输入/输出
无格式输入/输出
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
(C95)
格式输入
格式输出
文件定位
错误处理
文件操作
 
定义于头文件 <stdio.h>
(1)
FILE *fopen( const char *filename, const char *mode );
(C99 前)
FILE *fopen( const char *restrict filename, const char *restrict mode );
(C99 起)
errno_t fopen_s(FILE *restrict *restrict streamptr,

                const char *restrict filename,

                const char *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 - 决定访问模式的空终止字符串
文件访问
模式字符串
含义 解释 若文件已存在的动作 若文件不存在的动作
"r" 打开文件以读取 从头读 打开失败
"w" 创建文件以写入 销毁内容 创建新文件
"a" 后附 后附到文件 写到结尾 创建新文件
"r+" 读扩展 打开文件以读/写 从头读 错误
"w+" 写扩展 创建文件以读/写 销毁内容 创建新文件
"a+" 后附扩展 打开文件以读/写 写到结尾 创建新文件
文件访问模式标签"b"可以可选地指定以二进制模式打开文件。此标签仅在Windows系统上生效。
在附加文件访问模式下,数据被写入到文件尾,而不考虑文件位置指示器的当前位置。
当文件以更新模式打开时('+'作为上述模式参数值列表的第二或第三个字符),访问流可以进行输入和输出。然而输出不应直接紧随输入,而中间无对fflush函数或对文件定位函数(fseekfsetposrewind)的调用,且输入不应直接紧随输出,而中间无对文件定位函数的调用,除非输入操作遇到文件尾。在一些实现中,以更新模式打开(或创建)文本文件可能取代打开(或创建)二进制流。
文件访问模式标签"x"可以可选地后附于"w"或"w+"指定符。若文件存在,则此标签强制函数失败,而不重写它。(C11)
使用fopen_sfreopen_s时,任何以"w"或"a"创建的文件的文件访问许可禁止其他用户访问它。文件访问模式标签"u"可以可选地前附于任何以为"w"或"a"始的指定符,以启用默认的fopen许可。(C11)
streamptr - 指向存储函数结果的指针的指针(输出参数)

[编辑] 返回值

1) 若成功,则返回指向新文件流的指针。流是完全缓冲的,除非filename表示一个交互设备。错误时,返回空指针。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; // 注意:int,非char,要求处理EOF
    while ((c = fgetc(fp)) != EOF) { // 标准C I/O读取文件循环
       putchar(c);
    }
 
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
 
    fclose(fp);
}


[编辑] 参考

  • C11 standard (ISO/IEC 9899:2011):
  • 7.21.5.3 The fopen function (p: 305-306)
  • K.3.5.2.1 The fopen_s function (p: 588-590)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.19.5.3 The fopen function (p: 271-272)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.9.5.3 The fopen function

[编辑] 参阅

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