天天看点

Linux文件I/O操作

文件类型  

r读read

w写write

x执行execute

   
  - 普通文件

文本文件 cat命令可查看

二进制文件 cat本身,Linux可执行文件

文本文件 cat命令可查看

二进制文件 cat本身,Linux可执行文件

  l 链接文件 硬链接文件和符号链接文件;指针实现不同文件系统之间建立一种链接关系
  c 字符设备文件 设备文件 设备文件
  b 块设备文件
  p 管道文件 Linux进程间通信。匿名管道和命名管道  
  s 套接口文件

socket不同近算计的进程间的通信(套接字)

流式套接口:TCP套接口(面向连接的套接口)

数据报套接口:UDP套接口(无连接套接口)

原始套接口:SOCK_RAW

 
  d 目录文件 系统进行修改 系统进行修改
         
         
文件重定向   0标准输入,默认键盘可其他 1标准输出默认屏幕可文件;2标准出错,默认屏幕可文件  
  重定向标准输出      
  command > filename 把标准输出重定向到filename文件中 ls -l > file
    command >> filename 把标准输出重定向到filename文件中,方式是追加在现有内容后面  
    command 1 filename 把标准输出重定向到一个文件中  
    > myfile 创建一个长度为0的空文件  
  重定向标准输入      
    command < filename 以filename文件的内容作为command命令的标准输入 cat < from > to
    command < file1 > file2 一file1文件的内容作为command命令的标准输入,并以file2文件作为命令执行结果的标准输出  
    command << delimiter 从标准素如中读入,直至遇到delimiter分界符  
  重定向标准出错      
    command 2> filename 把标准出错重定向到filename中  
    command 2>> filename 把标准出错重定向追加到文件中  
文件创建打开关闭

//只有含‘写’的不存在的文件会新建,其他会报错  

//r只读;w只写;a尾增(附加/写);文本ASCII  

//rb读;wb写;ab尾增;二进制  

//以下读写↓  

//r+;w+;a+;文本ASCII  

//rb+;wb+;ab+二进制 

     
 

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

int open(const char *pathName,int flags)    
  返回-1出错,成功返回文件描述符fd int open(const char *pathName,int flags,mode_t mode) 地址,文件打开方式,指定创建文件权限  
 

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

int creat(const char*pathName,mode_t mode) creat->close->open  
  返回-1出错 等效open(pathName,O_RDWR|O_CREAT|O_TRUNC,mode)    
  #include<unistd.h> int close(int fd); fd需要关闭的文件的描述符  
  成功返回0,出错返回-1      
文件定位

#include<sys/types/h>

#include<unistd.h>

off_t lseek(int fd,off_t offset,int whence) fd文件描述符;offset偏移量字节数;whence偏移计算起始位置  
  出错-1,否则文件偏移量   whence :SEEK_SET文件开始处,SEEK_CUR当前位置,SEEK_END文件结尾  
文件读写 #include<unistd.h> ssize_t read(int fd,void *buf,size_t count) fd文件描述符;buf指针缓冲区;count要读取的字节数  
  出错-1,读到文件尾返回0      
  #include<unistd.h> ssize_t write(int fd,void *buf,size_t count) fd文件描述符;buf指针缓冲区;count要写入取的字节数  
  出错-1,否则返回成功写入字节数      
改变文件访问权限

#include<sys/types.h>

#include<sys/stat.h>

int chmod(const chat *pathName,mode_t mode)    
  出错-1,成功0 int fchmod(int fd,mode_t mode) 对已打开进行操作  
改变文件所有者

#include<sys/types/h>

#include<unistd.h>

int chown(const char*pathName,uid_t owner,gid_t group) owner所有者标识符,group表四组标识号  
    int fchown(int fd,uid_t owner,gid_t group) 已打开  
  出错-1成功0 int lchown(const char*pathname,uid_t owner ,gid_t group) 针对符号链接文件爱你  
重命名 #include<stdio.h> int rename(const char*oldname,const char*newname) newname已存在删除  
修改文件长度

#include<sys/types/h>

#include<unistd.h>

int truncate(const char *pathName,off_t len)    
  出错-1成功0 int truncate(int fd,off_t len)    
其他

#include<sys/types.h>

#include<sys/stat.h>

int stat(const char*pathName,strut stat*sbuf)    
    int fstat(int fd,stuct stat*sbuf)    
  成功返回0,出错返回-1 int lstat(const char*pathName,struct stat*sbuf)    
UNIXLinux常见基本系统数据类型 类型                 说明 struct stat {    
  caddr_t          核心地址         mode_t     st_mode;       //文件对应的模式,文件,目录等    
  clock_t          时钟滴答计数器(进程时间)         ino_t      st_ino;       //inode节点号    
  comp_t           压缩的时钟滴答         dev_t      st_dev;        //设备号码    
  dev_t           设备号         dev_t      st_rdev;       //特殊设备号码    
  fd_set           文件描述符集         nlink_t    st_nlink;      //文件的连接数    
  fpos_t           文件位置         uid_t      st_uid;        //文件所有者    
  gid_t           数值组ID         gid_t      st_gid;        //文件所有者对应的组    
  ino_t           i节点编号         off_t      st_size;       //普通文件,对应的文件字节数    
  mode_t           文件类型,文件创建模式         time_t     st_atime;      //文件最后被访问的时间    
  nlink_t           目录项的链接计数         time_t     st_mtime;      //文件内容最后被修改的时间    
  off_t           文件大小和偏移量         time_t     st_ctime;      //文件状态改变时间    
  pid_t           进程ID和进程组ID         blksize_t st_blksize;    //文件内容对应的块大小    
  ptrdiff_t           两个指针相减的结果         blkcnt_t   st_blocks;     //伟建内容对应的块数量    
  rlim_t           资源限制       };    
  sig_atomic_t           能原子的访问的数据类型      
  sigset_t           信号集      
  size_t           对象,大小,不带符号      
  ssize_t           返回字节计数的函数, 带符号的      
  time_t           日历时间的秒计数器      
  uid_t           数值用户ID      
  wchar_t           能表示所有不同的字符码      
复制已打开文件描述符 #include<unistd.h> int dup(int fd)    
  出错返回-1 int dup2(int fd,int fd2)    
改变已打开文件性质

#include<sys/types.h>

#include<unistd.h>

#include<fcntl.h>

int fcnt1(int fd,int cmd)    
  出错返回-1 int fcnt1(int fd,int cmd,long arg)    
同步命令 #include<unistd.h> void sync(void) 块缓存排入写队列,系统进程(update)30s条用一次sync。定期刷新内核块缓存  
  成功返回0,出错返回-1 int fsync(int fd) 引用单个文件,可用与数据库应用软件,确保修改过的块立即写到磁盘上  
目录文件操作

#include<sys/types/h>

#include<sys/stat.h>

int mkdir(const char*pathName,mode_t mode) 创建空目录(至少设置一个执行许可位)  
  成功返回0,出错返回-1      
  #include<unistd.h> int rmdir(const char*pathName) 删除空目录(必须空才能删除)  
  成功返回0,出错返回-1      
 

#include<sys/types.h>

#include<dirent.h>

DIR*opendir(const chat*pathName) 打开目录  
 

#include<sys/types.h>

#include<dirent.h>

int closedir(DIR*dp) 关闭目录  
 

#include<sys/types.h>

#include<dirent.h>

struct dirent*readdir(DIR*dp) 目录读取  
  #include<unistd.h> int chdir(const char*NewpathName)    
  成功返回0,出错返回-1 int fchdir(int Newfd) 改变当前工作路径  
  #include<unistd.h> char *getcwd(char *buf,size_t size) 获取当前工作路径,缓存长度size  
链接文件操作 #include<unistd.h> int link(const char*pathName1,const char*pathName2) 创建新目录项pathName2(必须不存在),引用现存文件pathName2 硬链接(同一文件系统,超级用户
  #include<unistd.h> int unlink(const char*pathName) 删除目录项
  #include<unistd.h> int symlink(const char*actualPath,const char*symPath) 创建一个指向actual的新目录项sym 符号链接(可不同文件系统,任意用户
  #include<unistd.h> readlink(const char*pathName,char*buf,int bufSzie) 查看pathname链接,信息存在buf中,并返回bufsize  
管道文件操作 #include<stdio.h> int pipe(int fdes[2]) 用于不同进程数据信息传递(管道创立成功返回文件描述符  
  普通设备相当于Linux目录/dev中的文件,用基于文件描述符I/O操作进行读写      
  特殊设备特殊性(磁带只能顺序读写访问,不能使用lseek随机读写      
设置缓存属性 #include<stdio.h> void setbuf(FILE*fp,char*buf) 激活或禁止缓冲区开关,BUFSIZ(全缓存)或无缓存  
  _IOFBF 全缓存 void setbuffer(FILE*fp,char*buf,size_t size) 自行指定缓冲区大小  
  _IOLBF 行缓存 void setlinebuf(FILE*fp) 行缓存  
  _IONBF 无缓存 int setvbuf(FILE*fp,char*buf,int mode,size_t size) 灵活性  
缓存清洗 #include<stdio.h> int fflush(FILE*fp) 将缓冲区中尚未写入文件的数据强制保存到文件。成功0,失败EOF  
  #include<stdio_ext.h> void fpurge(FILE*fp) 清除缓冲区数据  
流打开 #include<stdio.h> FILE*fopen(const char*pathName,const char*type) 从头开始读写 1. //只有含w的不存在的文件会新建,其他会报错  
    FILE*freopen(const char*pathName,const char*type,FILE*fp)

freopen("input1.txt","r",stdin);

freopen("output.txt","w",stdout);

2. //r只读;w只写;a尾增;文本ASCII  
  成功返回文件指针,失败NULL FILE*fdopen(int fd,const char *type) 从尾开始读写 3. //rb读;wb写;ab尾增;二进制  
    int fclose(FILE*fp)   成功0,失败EOF;网络环境检查必要性 4. //以下读写↓  
字符输入 #include<stdio.h> int getc ( FILE * fp );

读入字符

int ferror ( FILE *fp)出错为真

int feof( FILE * fp );文件结束为真

void cleareer(FILE*fp)清除两个标志

int ungetc(int c ,FILE*fp)字符送回流中

5. //r+;w+;a+;文本ASCII  
    int fgetc ( FILE * fp ); 6. //rb+;wb+;ab+二进制  
    int getchar (void);=getc(stdin)  
字符输出 #include<stdio.h> int putc ( int c,FILE * fp );    
    int fputc (int c, FILE * fp);     
  成功c,出错EOF int putchar (int c);=putc(c,stdout)    
行输入 #include<stdio.h> char*fgets(char*buf,int n,FILE*fp) 缓冲区读到'\n'结束  
  成功返回首地址,失败NULL char*gets(char*buf); 缓冲区由用户提供,缓冲区越界危险  
行输出 #include<stdio.h> int fputs(const char *buf,FILE*restrict fp)    
  成功返回字节数,失败-1 int puts(const char*str) 标准输出  
直接I/O操作 #include<stdio.h> size_t fread ( void * ptr, size_t size, size_t count, FILE * fp );    
    size_t fwrite ( const void * ptr, size_t size, size_t count, FILE*fp );    
格式化输出 #include<stdio.h> int printf ( const char * format, ... )    
    int fprintf ( FILE * fp, const char * format, ... ) 右到左(可以int到char/string)  
    int sprintf ( char*str, const char * format, ... )    
    int snprintf ( const char *str,size_t size, format, ... )    
格式化输入 #include<stdio.h> int scanf ( const char * format, ...);    
    int fscanf ( FILE*fp,char * str, const char * format, ...); 左到右(可以char/string到int)  
    int sscanf ( char * str, const char * format, ...);    

继续阅读