open系统调用:
*int open(const char path, int flags);
参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
返回值:打开成功,返回文件描述符;打开失败,返回-1
*int open(const char path, int flags,mode_t mode);
参数
path :文件的名称,可以包含(绝对和相对)路径
flags:文件打开模式
mode: 用来规定对该文件的所有者,文件的用户组及系统中其他用户的访问权限,则文件权限为:mode&(~umask)
返回值:打开成功,返回文件描述符;打开失败,返回-1
flags:
modes:
使用write()、read()进行文件读写,调用close(fd)关闭文件
fopen函数:
FILE *fp_w;
FILE *fp_r;
//fp_w = fopen("1.cvs", "a");
fopen_s(&fp_w ,"1.csv", "a");
for (int i = 0; i < 5; i++)
{
fprintf(fp_w, "%d,%d,%d\n", 1, 2, 3);
}
fclose(fp_w);
fopen_s在fopen的基础上加了溢出检测,更加安全。
向文件写数据:fscanf_s(fp_r, “%d,%d,%d”, &num[0], &num[1], &num[2]);
// 读取文件块数据
size_t fread(void *buffer, size_t size, size_t count, FILE *file);
// 写入文件块数据
size_t fwrite(const void *buffer, size_t size, size_t count, FILE *file);
参数:
buffer是读取与写入数据后存放地址,size是块长度,count是块的数量,实际读取长度为size*count,返回值为成功读取块的count数量。
open 与 fopen对比:
前者属于系统调用,低级IO,后者是库函数,高级IO。
前者返回一个文件描述符(用户程序区的)int,后者返回一个文件指针FILE*。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者
stat函数:
int stat(const char *pathname, struct stat *statbuf)
用于获取文件信息,在 statbuf 指向的缓冲区中返回有关文件的信息
返回值:成功返回0;失败返回-1
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
//stat结构:
struct stat
{
dev_t st_dev; //文件使用的设备号
ino_t st_ino; //索引节点号
mode_t st_mode; //文件类型和模式
nlink_t st_nlink; //文件的硬连接数
uid_t st_uid; //所有者的用户ID
gid_t st_gid; //所有者的组ID
dev_t st_rdev; //设备ID
off_t st_size; //以字节为单位的文件容量
blksize_t st_blksize; //文件系统 I/O块大小
blkcnt_t st_blocks; //文件所占的磁盘块
struct timespec st_atim; //最后一次访问该文件的时间
struct timespec st_mtim; //最后一次修改该文件的时间
struct timespec st_ctim; //最后一次修改文件状态的时 间
#define st_atime st_atim.tv_sec /* 向后兼容 */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
stat结构体中的st_mode 为文件类型定义了以下掩码值:
S_IFMT 0170000 bit mask for the file type bit field
S_IFSOCK 0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
POSIX 还定义了额外的宏,以允许在 st_mode 中编写文件类型的测试更简洁。
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
其他文件函数:
access 测试指定文件是否具有某种属性
chmod 修改文件权限
chown 修改文件所有者和所有组
truncate 修改文件大小
link 创建一个硬链接
symlink 创建一个软链接
readlink 读取软链接对应的文件名
unlink 删除一个硬链接
rename 重命名
lseek改变文件的偏移量
dup 文件描述符的复制,用于重定向,使新的描述符指向同一文件
dup2 成功返回newfd,失败返回-1
umask 修改打开文件的权限
fcntl 改变已打开文件的性质,针对描述符提供控制
复制一个现有的描述符
获取/设置文件描述符标记
获取/设置文件状态标记
获取/设置异步IO所有权
获取/设置记录锁
char *ttyname(int fd)
从文件描述符获得文件名
成功返回newfd,失败返回-1
umask 修改打开文件的权限
fcntl 改变已打开文件的性质,针对描述符提供控制
复制一个现有的描述符
获取/设置文件描述符标记
获取/设置文件状态标记
获取/设置异步IO所有权
获取/设置记录锁
char *ttyname(int fd)
从文件描述符获得文件名