C
编译器支持
语言
头文件
类型支持
程序工具
变参函数支持
错误处理
动态内存管理
字符串库
算法
数值
日期和时间工具
输入/输出支持
本地化支持
并发支持 (C11)
技术规范
符号索引
[编辑] 文件输入/输出
类型和对象
stdinstdoutstderr
FILE
fpos_t
函数
文件访问
fopenfopen_s(C11)
freopenfreopen_s(C11)
fwide(C95)
setbuf
setvbuf
fclose
fflush
非格式化输入/输出
fgetc
fgets
fputc
fputs
getchar
getsgets_s(直至 C11)(C11)
putchar
puts
ungetc
fgetwcgetwc(C95)(C95)
fgetws(C95)
fputwcputwc(C95)(C95)
fputws(C95)
getwchar(C95)
putwchar(C95)
ungetwc(C95)
格式化输入
scanffscanfsscanfscanf_sfscanf_ssscanf_s(C11)(C11)(C11)
wscanffwscanfswscanfwscanf_sfwscanf_sswscanf_s(C95)(C95)(C95)(C11)(C11)(C11)
vscanfvfscanfvsscanfvscanf_svfscanf_svsscanf_s(C99)(C99)(C99)(C11)(C11)(C11)
vwscanfvfwscanfvswscanfvwscanf_svfwscanf_svswscanf_s(C99)(C99)(C99)(C11)(C11)(C11)
直接输入/输出
fread
fwrite
格式化输出
printffprintfsprintfsnprintfprintf_sfprintf_ssprintf_ssnprintf_s(C99)(C11)(C11)(C11)(C11)
wprintffwprintfswprintfwprintf_sfwprintf_sswprintf_ssnwprintf_s(C95)(C95)(C95)(C11)(C11)(C11)(C11)
vprintfvfprintfvsprintfvsnprintfvprintf_svfprintf_svsprintf_svsnprintf_s(C99)(C11)(C11)(C11)(C11)
vwprintfvfwprintfvswprintfvwprintf_svfwprintf_svswprintf_svsnwprintf_s(C95)(C95)(C95)(C11)(C11)(C11)(C11)
文件定位
ftell
fgetpos
fseek
fsetpos
rewind
错误处理
clearerr
feof
ferror
perror
文件操作
remove
tmpfiletmpfile_s(C11)
rename
tmpnamtmpnam_s(C11)
[编辑]
定义于头文件
(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 是空指针
与所有进行边界检查的函数一样,只有当实现定义了 __STDC_LIB_EXT1__ 并且用户在包含
目录
1 参数
2 文件访问标志
3 返回值
4 注意
5 示例
6 引用
7 参阅
[编辑] 参数
filename
-
要将文件流关联到的文件名
mode
-
确定文件访问模式的以 null 结尾的字符串
streamptr
-
指向函数存储结果的指针(一个输出参数)
[编辑] 文件访问标志
文件访问模式字符串
含义
解释
文件已存在时的操作
文件不存在时的操作
"r"
读取
打开文件进行读取
从头开始读取
打开失败
"w"
写入
创建文件进行写入
销毁内容
创建新文件
"a"
追加
追加到文件
写入到末尾
创建新文件
"r+"
读取扩展
打开文件进行读/写
从头开始读取
错误
"w+"
写入扩展
创建文件进行读/写
销毁内容
创建新文件
"a+"
追加扩展
打开文件进行读/写
写入到末尾
创建新文件
可以可选地指定文件访问模式标志 "b" 以二进制模式打开文件。此标志在 POSIX 系统上没有效果,但在 Windows 上它会禁用对 '\n' 和 '\x1A' 的特殊处理。在追加文件访问模式下,无论文件位置指示器的当前位置如何,数据都将写入文件末尾。
如果模式不是上面列出的字符串之一,则行为是未定义的。某些实现定义了额外的受支持模式(例如 Windows)。
在更新模式('+')下,可以执行输入和输出,但输出后不能直接跟随输入,除非中间调用了 fflush、fseek、fsetpos 或 rewind;输入后也不能直接跟随输出,除非中间调用了 fseek、fsetpos 或 rewind,除非输入操作遇到了文件结尾。在更新模式下,即使指定文本模式,实现也允许使用二进制模式。
文件访问模式标志 "x" 可以选择附加到 "w" 或 "w+" 说明符。此标志强制函数在文件存在时失败,而不是覆盖它。(C11)
使用 fopen_s 或 freopen_s 时,任何使用 "w" 或 "a" 创建的文件的文件访问权限会阻止其他用户访问它。文件访问模式标志 "u" 可以选择性地添加到任何以 "w" 或 "a" 开头的说明符前,以启用默认的 fopen 权限。(C11)
[编辑] 返回值
1) 成功时,返回指向新文件流的指针。除非 filename 指的是交互式设备,否则流是完全缓冲的。出错时,返回空指针。POSIX 要求在这种情况下设置 errno。
2) 成功时,返回零,并将指向新文件流的指针写入 *streamptr。出错时,返回非零错误代码,并将空指针写入 *streamptr(除非 streamptr 本身是空指针)。
[编辑] 注意
filename 的格式是实现定义的,不一定指的是文件(例如,它可能是控制台或通过文件系统 API 可访问的其他设备)。在支持它们的平台上,filename 可以包含绝对或相对文件系统路径。
[编辑] 示例
运行此代码
#include
#include
int main(void)
{
const char* fname = "/tmp/unique_name.txt"; // or 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; // 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 is reached successfully");
is_ok = EXIT_SUCCESS;
}
fclose(fp);
remove(fname);
return is_ok;
}
可能的输出
Hello, world!
End of file is reached successfully
[编辑] 参考
C17 标准 (ISO/IEC 9899:2018)
7.21.5.3 fopen 函数 (p: 223-224)
K.3.5.2.1 fopen_s 函数 (p: 428-429)
C11 标准 (ISO/IEC 9899:2011)
7.21.5.3 fopen 函数 (p: 305-306)
K.3.5.2.1 fopen_s 函数 (p: 588-590)
C99 标准 (ISO/IEC 9899:1999)
7.19.5.3 fopen 函数 (p: 271-272)
C89/C90 标准 (ISO/IEC 9899:1990)
4.9.5.3 fopen 函数
[编辑] 另请参阅
fclose
关闭文件 (function) [编辑]
fflush
将输出流与实际文件同步 (function) [编辑]
freopenfreopen_s(C11)
用不同的名称打开一个现有流 (function) [编辑]
C++ 文档 for fopen