文件操作 -- 系统调用对比C语言下的文件操作

系统调用:(时间长。应当尽量减少系统调用的次数),进入内核之后调用。
函数调用:直接跳到函数的地址进行执行。

UNIX哲学之一 - 一切皆文件(Everything is a file)

文件描述符

对于Linux而言,所有对设备和文件的操作都是使用文件描述符来进行的。
文件描述符是一个非负的整数,它是一个索引值,并指向在内核中每个进程打开文件的记录表。
通常,一个进程启动时,都会打开3个文件:标准输入、标准输出和标准出错处理。这3个文件分别对应文件描述符为0、1和2(也就是宏替换STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO)。

底层文件I/O操作
open(); 
//函数是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。
close(); 
//函数是用于关闭一个被打开的文件。当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示地关闭一个文件。
read(); 
//函数是用于将从指定的文件描述符中读出的数据放到缓存区中,并返回实际读入的字节数。
//若返回0,则表示没有数据可读,即已达到文件尾。
//读操作从文件的当前指针位置开始。当从终端设备文件中读出数据时,通常一次最多读一行。
write(); 
//函数是用于向打开的文件写数据,写操作从文件的当前指针位置开始。对磁盘文件进行写操作,若磁盘已满或超出该文件的长度,则write()函数返回失败。
lseek(); 
//函数是用于在指定的文件描述符中将文件指针定位到相应的位置。
阻塞与非阻塞
fcntl函数

fcntl函数改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞、加锁等标志(这些标志称为File Status Flag),而不必重新open文件。

通过fcntl设置的都是当前进程如何设置访问设备和文件的访问控制属性,但是不设置文件或设备本身的属性,例如文件的读写权限、串口波特率等。

ioctl函数 — 用于向设备发控制或配置命令。
  • ioctl 函数是I/O操作的杂物箱。不能用本章中其他函数表示的I / O操作通常都能用ioctl表示。
  • 终端I/O是ioctl 的最大使用方面(POSIX.1已经用新的函数代替ioctl进行终端I / O操作)。
  • ioctl更多的是用于设备控制,比如磁盘的格式化,MODEM设备,磁带的快进、快倒等。
  • ioctl甚至可以读写一些数据,但是这些数据是不能用read、write读写的,称为out-of-band数据.
  • read\write读写的是in-band数据,是I/O操作的主体,而ioctl命令传送的是控制信息,其中的数据是辅助的数据.
mmap – 将一个文件或者其它对象映射进内存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cKfQhjmh-1574556178588)(en-resource://database/3733:1)]
mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址,对文件的读写可以直接用指针来做而不需要read/write函数。

C语言库函数I/O操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NVChdLKr-1574556178589)(en-resource://database/3735:1)]

着重注意文件有二进制文件以及文本文件
文件类型结构体FILE

  • 缓冲文件系统为每个正使用的文件在内存开辟文件信息区。
  • 文件信息用系统定义的名为FILE的结构体描述。
  • FILE定义在stdio.h中。
typedef struct
{
    short level; /* 缓冲区满/空程度 */
    unsigned flags; /* 文件状态标志 */
    char fd; /* 文件描述符 */
    unsigned char hold; /* 若无缓冲区不读取字符 */
    short bsize; /* 缓冲区大小 */
    unsigned char *buffer; /* 数据传送缓冲区位置 */
    unsigned char *curp; /* 当前读写位置 */
    unsigned istemp; /* 临时文件指示 */
    short token; /* 用作无效检测 */
} FILE ; /* 结构体类型名 FILE */

打开文件fopen

#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
//返回值:成功返回文件指针,出错返回NULL并设置errno,path是文件的路径名,mode表示打开方式。

关闭文件

#include <stdio.h>
int fclose(FILE *fp);
//返回值:成功返回0,出错返回EOF并设置errno

以字节为单位的I/O函数

#include <stdio.h>
int fgetc(FILE *stream);
int getchar(void);//一般不用
//返回值:成功返回读到的字节,出错或者读到文件末尾时返回EOF
#include <stdio.h>
int fputc(int c, FILE *stream);
int putchar(int c);
//返回值:成功返回写入的字节,出错返回EOF

操作读写位置的函数

#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
//返回值:成功返回0,出错返回-1并设置errno
long ftell(FILE *stream);
//返回值:成功返回当前读写位置,出错返回-1并设置errno
void rewind(FILE *stream);

以字符串为单位的I/O函数

#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
char *gets(char *s);
//返回值:成功时s指向哪返回的指针就指向哪,出错或者读到文件末尾时返回NULL
//fgets从指定的文件中读一行字符到调用者提供的缓冲区中  --- 保留\n
//gets从标准输入读一行字符到调用者提供的缓冲区中。 -- 删除掉\n
//gets函数的存在只是为了兼容以前的程序 ---- 一般不用
//fgets只适合读文本文件而不适合读二进制文件,并且文本文件中的所有字符都应该是可见字符,不能有'\0'。fgets会自动添加的结束符'\0'
#include <stdio.h>
int fputs(const char *s, FILE *stream);
int puts(const char *s);
//返回值:成功返回一个非负整数,出错返回EOF

以记录为单位的I/O函数

#include <stdio.h>
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);
//返回值:读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录数小于nmemb,也可能返回0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值