linux 文件操作
总结linux 下的常用文件操作
打开文件 open
#include
#include
#include
int fd=open(const char *pathname, int flags);
pathname:文件名
flags:文件操作位
O_RDONLY=只读
O_WRONLY=只写
O_RDWR=可读可写
返回值fd:-1=打开错误
其他=指向这个文件的文件描述符
从文件中读数据,把数据读取到缓冲区:read
#include
ssize_t numread=read(int fd, void *buf, size_t count);
fd=文件描述符
buf=存放数据的目的缓冲区
count=读取数据的字节个数。
返回值numread:-1=读取错误
正整数=成功读取的字节数目
关闭文件 close
#include
int result=clsoe(int fd)
fd=文件描述符
result:-1=关闭错误,0=关闭成功
创建/重写文件 creat
#include
int fd=creat(const char *pathname, mode_t mode);
pathname=文件名
mode=访问模式
O_APPEND
O_ASYNC
O_CLOEXEC
O_CREAT
...
返回值: -1=错误,fd=文件描述符
如果 pathname 存在,那么就打开这个文件
如果 pathname 不存在,就创建这个文件
向文件写入数据 write
#include
ssize_t result=write(int fd, const void *buf, size_t count);
fd= 文件描述符
buf= 待写入数据
count= 写入数据个数
result:-1=写错误,正整数=成功写入个数
每次系统打开一个文件都会保存一个指针记录文件的当前记录。
这个指针是与文件描述符关联的,有几个文件描述符既有几个指针。
lseek 可以改变文件描述符所关联的指针的位置
重定位文件读写位置 lseek
#include
#include
off_t dolpos=lseek(int fd, off_t offset, int whence);
fd=文件描述符
offset=文件的移动距离,可以为负数
whence=移动起始位置
SEEK_SET=文件起始位置
SEEK_CUR=文件当前位置
SEEK_END=文件结束位置。
dolpos:-1=错误 正整数=指针变化前的位置
例:lseek(fd, 0, SEEK_CUR) 返回文件指针指向的当前位置
打开一个文件,获取指向这个文件的数据流 fopen
#include
FILE *stream=fopen(const char *path, const char *mode);
FILE *stream=fdopen(int fd, const char *mode);
FILE *stream=freopen(const char *path, const char *mode, FILE *stream);
path=文件名
mode=打开模式 r,r+,w,w+,a,a+
fd=文件描述符
stream=指向这个文件的信号输出输入流
从指定文件流中读取 指定长度数据 fgets
#include
char *pc=fgets(char *s, int size, FILE *stream);
s= 存储读出的数据
size=读取的数据长度
stream=文件流
pc:返回值 NULL=读取错误,非NULL=成功
int fgetc(FILE *stream);
从文件流 stream 中读取一个字符
char *fgets(char *s, int size, FILE *stream);
从文件流 stream中读取给定长度字符
int getc(FILE *stream);
从文件流 stream 中读取下一个字符,默认会读取多个字符。
int getchar(void);
从stdin()中标准输入设备读取下一个字符
char *gets(char *s);
从stdin()中标准输入设备读取一串 ‘\n’或‘\0’ 结尾的字符串
int ungetc(int c, FILE *stream);
将字符c输出到 文件流中,返回c成功, EOF失败
输出到文件流中
#include
int fputc(int c, FILE *stream);
将字符c输出到 文件流中,返回c成功, EOF失败
int fputs(const char *s, FILE *stream);
将字符串s输出到 文件流中,没有文件结尾符'\0', EOF失败,非0成功
int putc(int c, FILE *stream);
将字符c输出到 文件流中,返回c成功, EOF失败,默认会多次输出,调用 fputc
int putchar(int c);
将字符c输出到 标准输出流 stdout 中,返回c成功, EOF失败,默认会多次输出 调用 putc
int puts(const char *s);
将字符c输出到 标准输出流 stdout 中,并输出"\n",EOF失败,非0成功
关闭文件流指针 fclose
#include
int fclose(FILE *fp);
fp=文件流指针
返回值:0=成功,其余=失败
修改文件流指针位置 fseek
#include
int fseek(FILE *stream, long offset, int whence);
stream=文件流指针
offset=移动距离
whence=移动起始点
SEEK_SET=文件起始位置
SEEK_CUR=文件当前位置
SEEK_END=文件结束位置
基于文件流的读写 fread/fwrite
#include
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr= 数据缓存地址
size= 元素长度
nmemb= 元素个数
返回值 : 负数=失败,正整数=成功读写元素个数 ps:元素可以是一个结构体
查看文件的属性: stat
#include
#include
#include
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
path=文件名
fd=文件描述符
buf=存放文件属性的结构指针
返回值:0=成功,-1=失败
修改文件属性 chmod
#include
int chmod(const char *path, mode_t mode);
path=文件名
mode=新的文件权限和属性类型 如 0744
返回值:-1=失败,0=成功
修改文件所有者 chown
#include
int chown(const char *path, uid_t owner, gid_t group);
path=文件名
owner=新的文件所有者ID
group=新的组ID
返回值:-1=失败,0=成功
修改文件最后修改和访问时间 utime
#include
#include
int utime(const char *filename, const struct utimbuf *times);
filename=文件名
times=结构 utimbuf 的指针,
返回值:-1=失败,0=成功
修改文件名 rename
#include
int rename(const char *oldpath, const char *newpath);
oldpath=旧的文件/目录名
newpath=新的文件/目录名
返回值:-1=失败,0=成功
控制文件描述符 fcntl
#include
#include
int ret=fcntl(int fd, int cmd, ... /* arg */ )
fd=文件描述符
cmd=需要进行的操作
/* arg */ =操作的参数
ret:-1=失败,其余,按操作而定。
fcntl 在fd指定的文件上执行操作cmd。arg是cmd 的参数/。
读取tty(终端)驱动程序的属性 tcgetattr
#include
#include
int ret=tcgetattr(int fd, struct termios *termios_p);
fd=文件描述符
termios_p=指向终端结构的指针
ret:-1=失败,成功。
设置tty驱动程序的属性 tcsetattr
#include
#include
int tcsetattr(int fd, int optional_actions,const struct termios *termios_p);
fd=文件描述符
optional_actions=改变设置的时间
TCSANOW=立即
TCSADRAIN=等待驱动程序队列中的所有输出都被传送到终端
TCSFLUSH=等待指到驱动程序队列中的所有输出都被传送出去,释放队列中的所有输入数据。
termios_p=指向终端程序的指针
ret:-1=失败 0=成功