文章目录 文件的打开 文件的关闭 处理错误信息 errno错误码变量 perror()打印错误描述 strerror() 获取错误描述字符串 文件的访问权限 不受umask影响的方法 方法1:使用chmod或fchmod立即修正 方法2:先修改umask,创建文件后恢复 文件的打开 打开函数 头文件: 函数原型:FILE *fopen (const char *path, const char *mode); 参数:path: 普通文件,当前路径不需要加目录,其他要使用完整的路径 mode:文件打开的模式 返回值:成功时返回有关文件的FILE指针 出错返回NULL 所以使用fopen函数必须判断是否为空 打开模式 模式 含义 r或rb 以只读方式打开文件,文件必须存在 r+或r+b 以读写方式打开文件,文件必须存在 w或wb 以只写方式打开文件,若文件存在则文件长度清为0,若文件不存在则创建 w+或w+b 以读写方式打开文件,若文件存在则文件长度清为0,若文件不存在则创建 a或ab 以只写方式打开文件,若文件不存在则创建;向文件写入的数据被追加到文件末尾 a+或a+b 以读写方式打开文件,若文件不存在则创建;向文件写入的数据被追加到文件末尾
文件IO和标准IO的模式对应关系 标准IO中,存在的文件,第二个参数mode一般指定的是文件打开的模式。不存在的文件会创建,第二个mode默认会指定文件打开的模式和默认的文件打开的权限FILE* fopen (const char *path, const char *mode); 文件IO中,第二个参数flags指定的是文件打开的模式, 第三个参数mode指定新文件打开的权限int open(const char *pathname, int flags, mode_t mode); 标准IO 文件IO r O_RDONLY r+ O_RDWR w O_WRONLY w+ O_RDWR a O_WRONLY a+ O_RDWR
# include <stdio.h> int main ( int argc, char * argv[ ] ) { FILE* fp= NULL ; if ( ( fp= fopen ( "test.txt" , "r" ) ) == NULL ) { printf ( "fopen error\n" ) ; return - 1 ; } printf ( "fopen success\n" ) ; fclose ( fp) ; return 0 ; } 文件的关闭 关闭函数 头文件: 函数原型: 参数: 返回值:fclose()调用成功返回0,失败返回EOF(-1),并设置errno; 流关闭时自动刷新缓冲中的数据并释放缓冲区,比如:常规文件把缓冲区内容写入磁盘; 当一个程序正常终止时,所有打开的流都会被关闭,流一旦关闭后就就不能执行任何操作 处理错误信息 errno错误码变量 errno 全局变量,由系统生成,记录最近一次系统调用的错误码 头文件: 函数原型: 初始值为0:表示没有错误 perror()打印错误描述 根据errno值,输出对应的错误描述 perror先输出字符串s,再输出错误号对应的错误信息 头文件: 函数原型:void perror(const char *s); 参数s是自定义前缀信息 strerror() 获取错误描述字符串 strerror根据错误号返回对应的错误信息 不会自动使用当前errno,需要显式传入 头文件: 函数原型:char *strerror(int errno); printf("Error: %s\n", strerror(errno));# include <stdio.h> # include <unistd.h> # include <errno.h> # include <string.h> extern int errno; int main ( int argc, const char * argv[ ] ) { FILE* fp= NULL ; # if 0 if ( ( fp= fopen ( "test.txt" , "r" ) ) == NULL ) { printf ( "errno:%d\n" , errno) ; perror ( "fopen:" ) ; return - 1 ; } # else if ( ( fp= fopen ( "test.txt" , "r" ) ) == NULL ) { printf ( "errno:%d\n" , errno) ; printf ( "fopen:%s\n" , strerror ( errno) ) ; return - 1 ; } # endif printf ( "errno:%d\n" , errno) ; perror ( "perror:" ) ; sleep ( 3 ) ; fclose ( fp) ; return 0 ; } 文件的访问权限 文件打开的模式 和 文件访问的权限是两个不同的概念 文件打开的模式fopen函数的对文件的打开操作,文件访问的权限是文件的属性。fopen() 默认创建的文件访问权限是0666(rw-rw-rw-) 是8进制的形式,分别依次对应三组对文件的权限,当前用户的,当前用户所在组的,当前用户所在组其他用户,4 可读 2 可写 1 可执行,也可以用字母r w x表示,-表示没有任何权限 Linux系统中umask设定会影响文件的访问权限,其规则为(0666 & ~umask),Root用户的umask是 022, 普通用户的umask是002,用户可以通过umask函数或者命令修改相关设定 不受umask影响的方法 方法1:使用chmod或fchmod立即修正 # include <sys/stat.h> # include <fcntl.h> int main ( ) { // 创建文件 int fd= open ( "myfile.txt" , O_CREAT| O_WRONLY, 0666 ) ; if ( fd== - 1 ) { perror ( "open" ) ; return 1 ; } // 立即设置权限(忽略umask) if ( fchmod ( fd, 0666 ) == - 1 ) { perror ( "fchmod" ) ; } close ( fd) ; return 0 ; } 方法2:先修改umask,创建文件后恢复 # include <sys/stat.h> # include <sys/types.h> int main ( ) { mode_t old_mask= umask ( 0 ) ; // 临时设置umask为0 // 现在创建文件不受umask影响 int fd= open ( "myfile.txt" , O_CREAT| O_WRONLY, 0666 ) ; umask ( old_mask) ; // 恢复原来的umask close ( fd) ; return 0 ; }