linux fread 头文件,Linux文件操作

Linux中一切都是文件。如普通文件,目录,设备,管道等。

操作这些文件有两种方式,调用系统函数和使用标准I/O库。

一、调用系统函数

1.文件描述符:数值类型,表示打开的文件标识

程序运行时,会首先打开3个文件描述符,0(标准输入文件),1(标准输出文件),2(标准错误文件)

2.系统调用常用函数

1)open函数:打开文件

原型为:

int open(const char *path,intoflags)int open(const char *path,int oflags,mode_t mode)

path:完整的文件路径

oflags:文件访问模式(只读,只写,可读写)

mode:设定文件访问权限

返回值:返回与文件关联的文件描述符,失败返回-1

注意这个描述符是唯一的,不与其他进程共享,文件对应的文件描述符并不是固定的。

2)write函数:写入文件

原型为:

size_t write(int fildes,const void *buf,size_t nbytes);

将buf缓冲区的前nbyts个字节,写入文件描述符files关联的文件中。

返回值:实际写入的字节数,失败返回-1

3)read函数:读取文件

原型为:

size_t read(int fildes,void *buf,szie_t nbytes);

读取文件描述符fildes关联的文件中前nbytes个字节,到buf缓冲区

返回值:实际读取的字节数,失败返回-1

4)close函数:关闭文件

原型为:

int close(int fildes);

返回值:成功返回0,失败返回-1

3.调用系统函数示例

从一个文件中复制数据到另一个文件,代码如下:

copy.c

#include#include

intmain()

{char c='\0';int in=-1,out=-1;in=open("myfile.txt",O_RDONLY);//以只写方式创建文件,若文件不存在则新建一个文件//文件所有者具有读和写权限

out=open("myfile2.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);while(read(in,&c,1)==1)

write(out,&c,1);

close(in);

close(out);return 0;

}

输出结果:

7a390091438ce1a9aa25a7b60a71dfb1.png

4.标准I/O库

在标准I/O中,使用的是文件流,对应着底层的文件描述符。

文件流是一个指向FILE结构的指针。

I/O库的函数包含在头文件stdio.h中。

1)fopen函数:打开文件

原型为:

FILE* fopen(const char *filename,const char *mode);

与底层open函数类似

返回值:成功返回非空指针,失败返回NULL

2)fread函数:读取文件

原型为:

size_t fread(void *ptr,size_t size,size_t nitems,FILE *stream);

与底层read函数类似

从stream读取nitems个长度为size的数据到ptr指向的缓冲区

返回值:成功读取的字节数,失败返回-1

3)fwrite函数:写入文件

原型为:

size_t fwrite(const void *ptr,size_t size,size_t nitems,FILE *stream);

与底层write函数类似

从ptr指向的缓存区读取nitems个长度为size的数据,并把它们写到stream对应的文件中。

返回值:成功写入的字节数,失败返回-1

4)fclose函数:关闭文件

原型为:

int fclose(FILE *stream);

返回值:成功返回0,失败返回-1

5.标准I/O使用示例

与前例一样,从一个文件中复制数据到另一个文件,只是使用I/O库函数来实现,

代码如下:

#include#include

intmain()

{int c=0;

FILE*pfin =NULL;

FILE*pfout =NULL;

pfin= fopen("myfile.txt","r");

pfout= fopen("myfile2.txt","w");while(fread(&c,sizeof(char),1,pfin))

fwrite(&c,sizeof(char),1,pfout);

fclose(pfin);

fclose(pfout);return 0;

}

输出结果:

2119ab9c64df4d04d97e3158ad4a0095.png

程序中的读和写数据可以用库中的其他函数来代替,如fget,fputc等。

6.文件描述符和文件流

一般不要混合使用底层输入输出与高层文件流操作。

调用fileno函数,可以获得文件流使用的底层文件描述符

原型为:int fileno(FILE *stream);

调用fdopen函数,可以在一个已经打开的文件描述符上创建一个新的文件流

原型为:FILE* fdopen(int fildes,const char* mode);

Linux下编程时,一般使用系统调用,而不使用I/O库。

有些操作必须使用系统调用,如创建文件读写锁等。

7.系统调用性能优化

我们使用time命令测试系统调用和I/O库两种方法的运行时间,

结果如下所示:

2f186b9f5e50163f1b02e16a5c41c031.png

可以看出,系统调用的效率要明显低于I/O库,这是为什么呢?

因为系统调用时,Linux必须从运行用户代码切换到内核代码,然后再返回用户代码。

而I/O库函数会自动在数据满足数据块长度时,才调用底层系统函数。

系统调用代码优化如下,每次一次性读取和写入N个字节,减少系统调用次数。

copyopt.c

#include#include

intmain()

{char buffer[1024];int in=-1,out=-1;int nread=0;in=open("myfile.txt",O_RDONLY);//以只写方式创建文件,若文件不存在则新建一个文件//文件所有者具有读和写权限

out=open("myfile2.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);while(nread=read(in,buffer,sizeof(buffer))>0)

write(out,buffer,nread);

close(in);

close(out);return 0;

}

使用time测试输出如下:

8432d30ada46b47f0356cddb6270c0f5.png

可以看出,性能得到了提高,甚至超过了使用I/O的性能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值