Linux文件编程
Linux系统调用及用户编程接口(API)
系统调用:操作系统提供给用户的一组“特殊”接口,用户程序通过这组“特殊”接口来获得操作系统内核提供的服务
为什么用户进程不能直接访问操作系统内核提供的服务? 为了保护内核
用户进程在通常情况下不允许访问内核数据,也无法使用内核数据
系统调用仅是一个软中断机制向内核提供请求,以获取内核服务的接口,在实际使用中程序员调用的通常是用户编程接口——API
linux文件分为:普通文件,目录文件,链接文件,设备文件
文件描述符是一个非负整数,它是一个索引值
一个进程启动,都会打开三个文件:标准输入,标准输出,标准出错处理
所以文件描述符一般从3开始,往上递增
创建:int creat(char *filename,mode_t mode)
实际中已不常用
打开:open(*filename,flags,mode)
打开或创建文件
成功则返回新分配的文件标识符
出错则返回-1并配置errno
当操作完系统后,需关闭文件
int close(int fd);
写:int write(int fd,const void *buf,size_t length)
把length个字节从buf指向的缓冲区中写到fd指向的文件中,返回值为实际写入的字节数
定位:int lseek(fd,offset,whence)
文件读写指针相对whence移动offset个字节
操作成功,返回文件指针相对文件头的位置
offset可取负值,表示向前移动
读:int read(int fd,const *void buf,size_t length)
从fd所指的文件中读取length个字节到buf所指的缓冲区
返回值为读取的字节数 遇到EOF就结束
如果出错:
printf(‘errno:%d ’,errno);
strerror(errno); 把errno的值翻译出来,所以perror结合了printf,strerror
perror(“xxx”); 把xx输出,后面接失败原因
C库文件
操作独立于操作平台的
标准I/O库是带缓存的I/O库
标准I/O提供缓存的目的是减少调用read和write的目的
不带缓存的I/O是对文件描述符操作,带缓存的I/O是针对流的
提供三种类型的缓存:
全缓存
行缓存:遇到换行符或缓存满时,才由标准I/O执行实际I/O操作 printf,strin,stdout
无缓存:作用相当于read,write,stderr
每次使用fgets和fputs时,需要复制两次数据
第一次是在内核和标准I/O缓存之间
第二次是在标准I/O缓存和用户程序的行缓存之间
一个流一般对应一个文件
int fflush(FILE *stream); 手动刷新缓存
创建和打开:FILE *fopen(char *filename,char *mode)
r,rb :文件必须已经存在
w,wb:如果文件不存在则创建,如果已存在,则清空重写
a,ab: 只能在文件末尾追加数据,如果文件不存在则创建
关闭 int fclose(FILE *stream)
若成功则返回0,有错误发生则返回EOF
fputc(int c,FILE *stream) 将参数c转换为unsigned char 后写入stream指定文件中
fgetc(FILE *stream) 从stream所指文件中读取一个字符,若返回EOF则表示到了文件尾
fputs(int c,FILE *stream) 将s所指的字符串到写入stream指定文件中
Fgets(char *s,size,stream) 从stream所指文件内读入字符并存到s所指的内存空间,直到出现换行符,读到文件尾或已读了size-1个字节,最后加上NULL作为字符串结束
若成功则返回s指针,返回NULL表示有错误发生
size_t fread(*ptr,size,nmemb,*stream) 返回实际读取的块数
size_t fread(*ptr,size,nmemb,*stream) 将数据写入到文件流中。返回实际写入的块数
取得文件流的读写位置
ftell(FILE *stream) 成功时返回目前的读写位置,若有错误则返回-1
getc和fgetc作用相同,putc和fputc作用相同,但getc,putc为宏定义,非真正的函数调用
fprintf( * stream,* format ,... ) 将结果输出到stream指定文件中,直至出现‘\0’
fscanf(* stream,* format ,...) 从stream指定文件中读取字符串
feof() 用来侦测是否读取到了文件尾,如果已到了文件尾返回非零值,其他情况返回0