Linux文件操作
Linux中一切都是文件。如普通文件,目录,设备,管道等。
操作这些文件有两种方式,调用系统函数和使用标准I/O库。
一、调用系统函数
1.文件描述符:数值类型,表示打开的文件标识
程序运行时,会首先打开3个文件描述符,0(标准输入文件),1(标准输出文件),2(标准错误文件)
2.系统调用常用函数
1)open函数:打开文件
原型为:
int open(const char *path,int oflags)
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<fcntl.h>
#include<stdlib.h>
int main()
{
char c='\0';
int in=-,out=-;
in=open("myfile.txt",O_RDONLY);
//以只写方式创建文件,若文件不存在则新建一个文件
//文件所有者具有读和写权限
out=open("myfile2.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
while(read(in,&c,)==)
write(out,&c,);
close(in);
close(out);
return ;
}
输出结果:
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<stdio.h>
#include<stdlib.h>
int main()
{
int c=;
FILE *pfin = NULL;
FILE *pfout = NULL;
pfin = fopen("myfile.txt","r");
pfout = fopen("myfile2.txt","w");
while(fread(&c,sizeof(char),,pfin))
fwrite(&c,sizeof(char),,pfout);
fclose(pfin);
fclose(pfout);
return ;
}
输出结果:
程序中的读和写数据可以用库中的其他函数来代替,如fget,fputc等。
6.文件描述符和文件流
一般不要混合使用底层输入输出与高层文件流操作。
调用fileno函数,可以获得文件流使用的底层文件描述符
原型为:int fileno(FILE *stream);
调用fdopen函数,可以在一个已经打开的文件描述符上创建一个新的文件流
原型为:FILE* fdopen(int fildes,const char* mode);
Linux下编程时,一般使用系统调用,而不使用I/O库。
有些操作必须使用系统调用,如创建文件读写锁等。
7.系统调用性能优化
我们使用time命令测试系统调用和I/O库两种方法的运行时间,
结果如下所示:
可以看出,系统调用的效率要明显低于I/O库,这是为什么呢?
因为系统调用时,Linux必须从运行用户代码切换到内核代码,然后再返回用户代码。
而I/O库函数会自动在数据满足数据块长度时,才调用底层系统函数。
系统调用代码优化如下,每次一次性读取和写入N个字节,减少系统调用次数。
copyopt.c
#include<fcntl.h>
#include<stdlib.h>
int main()
{
char buffer[];
int in=-,out=-;
int nread=;
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))>)
write(out,buffer,nread);
close(in);
close(out);
return ;
}
使用time测试输出如下:
可以看出,性能得到了提高,甚至超过了使用I/O的性能。
Linux文件操作的更多相关文章
- C/C++以及Linux文件操作备忘录
目录 C文件操作 文件开关 文件读写 C++文件操作 Linux文件操作 打开 C文件操作 #include<stdio.h> stdin, stdout, stderr 文件开关 /* ...
- Linux 文件操作接口
目录 Linux 文件操作接口 C语言文件操作接口 C语言文件描述 fopen() r模式打开文件 w模式打开文件 a模式打开文件 其他模式类似 fclose() fwrite() fread() 系 ...
- Linux文件操作的主要接口API及相关细节
操作系统API: 1.API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用,应用层程序通过调用API来调用操作系统中的各种功能,来干活 文件操作的一般步骤: 1.在linux系统 ...
- Linux 文件操作监控inotify功能及实现原理【转】
转自:http://blog.chinaunix.net/uid-26585427-id-5012973.html 1. inotify主要功能 它是一个内核用于通知用户空间程序文件系统变化的机制. ...
- Linux 文件操作总结
http://blog.163.com/he_junwei/blog/static/19793764620152592737741/ ioctl?? lseek?? 文件是linux中的一个重要概念. ...
- Linux文件操作学习总结【转载】
本文转载自: http://blog.csdn.net/xiaoweibeibei/article/details/6556951 文件类型:普通文件(文本文件,二进制文件).目录文件.链接文件.设备 ...
- Linux 文件操作——系统调用和标准I/O库
一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件.看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例如一个文本是一个文件,一个work文档是一个文件等 ...
- linux 文件操作与目录操作
文件操作 使用命令 命令格式: 命令 [选项] [参数] [] 表示可选的 示例: ls -a /etc 常识命令 ls:查看指定目录的内容,不指定目录时查看当前工作目录 选项 说明 -a 显示所有文 ...
- Linux文件操作常用命令整理
收集.整理日常系统管理或维护当中的,常用到的一些关于文件操作的命令或需求,后续会慢慢补充.完善! 查看.生成指定目录的目录树结构? [root@DB-Server ~]#tree #当前目录 ...
- linux 文件操作库函数
fopen :打开文件 fread :读文件 fwrite : 写文件 fgetc : 读字符 fputc : 写字符 fscanf : 格式化读 fprintf : 格式化写 fseek : 文件偏 ...
随机推荐
- C++数据结构之链式队列(Linked Queue)
C++数据结构之链式队列,实现的基本思想和链式栈的实现差不多,比较不同的一点也是需要注意的一点是,链式队列的指向指针有两个,一个是队头指针(front),一个是队尾指针(rear),注意指针的指向是从 ...
- bistu新生-1005
#include "stdio.h"#include "string.h"int main(){ char ku[]={'0','1','2','3','4', ...
- 迪士尼黑科技:爬墙机器人 VertiGo
12 月 30 日,迪士尼研发出的一款爬墙机器人曝光了一段有趣的视频.从视频里可看出这个机器人碰到墙壁时迅速地作出反应爬了上去. 据了解,这个爬墙机器人名叫 VertiGo,由迪士尼研究中心和苏黎世联 ...
- TableView--通讯录--开篇
一,需求图:
- 20145210 《Java程序设计》第十周学习总结
教材学习内容总结 网络编程 •网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. •程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴. •在发送 ...
- HDU 3932
http://acm.hdu.edu.cn/showproblem.php?pid=3932 一定范围的平面上给一些点,求到这些点的最大距离最小,和上一题的题意正好相反,稍微改一下就可以 这个问题又叫 ...
- 使用Office 365 试用账户 体验Office 365功能
首先,需要申请Office 365 Enterprise E3版本的试用账户. 在浏览器中,输入以下地址,然后回车: http://products.office.com/en-us/business ...
- js控制tr 隐藏 显示
tr td 外面不要套div <tr> <td>排期确定结果: </td> <td> <label class="liradio&quo ...
- 【转】C++析构函数为什么要为虚函数
注:本文内容来源于zhice163博文,感谢作者的整理. 1.为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生. 下面转自网络:源地址 ...
- jquery 平滑滚动页面到某个锚点
$(document).ready(function() { $("a.topLink").click(function() { $ ...