系统编程之文件系统编程
来源:互联网 发布:ubuntu 安装微信 编辑:程序博客网 时间:2024/05/16 09:56
系统调用:所有的操作系统都提供多种服务的入口点,程序由此向内核请求服务。这些可直接进入内核的入口点被称为系统调用。
不同操作系统提供了自己的一套系统调用,所以系统调用无法实现跨平台使用。而且频繁地系统调用,在用户态和内核态之间切换,很耗费资源,效率不高。C标准库提供了操作文件的标准I/O函数库,与系统调用相比,主要差别是实现了一个跨平台的用户态缓冲的解决方案。缓冲区可以减少系统调用的次数,提高运行效率。C标准库是系统调用的封装,在内部区分了操作系统,可实现跨平台使用。
1、打开和关闭文件:
系统调用函数:
函数原型:
int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);int creat(const char *pathname, mode_t mode);
int close(int fd);
代码示例:
int fd;if (fd = open("test.txt",O_RDONLY | O_CREAT,O_IWOTH) == -1){printf ("文件打开失败\n");perror ("open");}close(fd);
标准I/O函数:
函数原型:
FILE *fopen(const char *path, const char *mode);FILE *fdopen(int fildes, const char *mode);FILE *freopen(const char *path, const char *mode, FILE *stream);
int fclose(FILE *fp);
代码示例:
FILE *fp = fopen("abc","a");if(fp == NULL){perror("fopen");return -1;}printf ("文件打开成功\n");fclose (fp);
2、读文件和写文件:
系统调用函数:
函数原型:
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
代码示例(复制文件):
int fd1 = open("1.ppt",O_RDONLY);if (fd1 == -1){perror("open");}int fd2 = open("2.ppt",O_WRONLY | O_CREAT);if (fd2 == -1){perror("open");}int ret = 0;char buf[SIZE] = {0};while (ret = read(fd1,buf,SIZE)){if (ret == -1){perror ("raed");break;}write (fd2,buf,ret);}printf ("文件复制成功\n");close (fd1);close (fd2);
标准I/O函数:
函数原型:
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);
代码示例:
FILE *fp1 = fopen("1.ppt","a");if(fp1 == NULL){perror("fopen");return -1;}FILE *fp2 = fopen("1.ppt","a");if(fp2 == NULL){perror("fopen");return -1;}printf ("文件打开成功\n");int ret = 0;char buf[SIZE] = {0};while (ret = fread(buf,sizeof(char),SIZE,fp1)){fwrite(buf,sizeof(char),ret,fp2);}if (ret == 0 && !feof(fp1)){perror ("fraed");return -1;}printf ("文件复制成功\n");
3、移动文件偏移指针:
系统调用函数:
函数原型:
off_t lseek(int fildes, off_t offset, int whence);
代码示例1:
int fd;if ((fd = open("test",O_RDWR | O_CREAT,0777)) == -1){printf ("文件打开失败\n");perror ("open");}lseek (fd,15,SEEK_SET);write(fd,"abc",4);close(fd);
代码实例2:(建一个1G的大文件)
int fd;if ((fd = open("big",O_RDWR | O_CREAT,0777)) == -1){printf ("文件打开失败\n");perror ("open");}lseek (fd,1024*1024*1024,SEEK_SET);write(fd,"\0",1);close(fd);
关于文件编程的更多函数及其使用,欢迎大家一起交流。
阅读全文
0 0
- 系统编程之文件系统编程
- linux编程之文件系统
- Unix系统编程(2) - 文件系统
- linux系统编程手册 文件系统
- linux下C编程之文件系统编程
- Linux内核编程之文件系统
- C语言之文件系统编程
- 文件系统编程
- 文件系统编程
- 多线程编程之系统编程
- Linux文件系统编程 系统调用 文件复制
- 系统编程之信号
- ZYNQ系统中实现FAT32文件系统的SD卡读写之三 SDK编程调试
- Linux 文件系统编程之系统调用和标准I/O库
- Linux 内核编程之文件系统(一)
- Linux 内核编程之文件系统(二)
- Linux 内核编程之文件系统(二)
- Linux 内核编程之文件系统(一)
- python-pandas的基本用法09
- 算法十
- spring中的@Transactional注解
- java中的内部类
- 编程练习2——07
- 系统编程之文件系统编程
- java,v-o-l-a-t-i-l-e
- Java进阶01 String类
- python 链接 ORACLE 数据库,并打印数据.解决中文乱码问题
- 暴力求解法_简单枚举(除法,最大乘积法,分数拆分,双基回文数)
- 编程练习2——08
- 20170801-20170806
- Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别
- XYNU—ACM暑假集训第四次测试 STL