标签:
一、文件的系统调用
1.文件描述符
文件描述符是一些小数值,你可以通过它们访问的打开的文件设备,而有多少文件描述符可用取决于系统的配置情况。但是当一个程序开始运行时,
它一般会有3个已经打开的文件描述符,就是
0:标准输入 1:标准输出 2:标准错误
这些数字就是文件描述符,因为在Linux上一切都是文件,所以标准输入(stdin)、标准输出(stdout)和标准错误(stderr)也可看作文件来对待。
2.系统调用常用函数 (头文件<fcntl.h>、<unistd.h>)
1) open
函数原形
int open(const char *path, int oflags); int open(const char *path, int oflags, mode_t mode);
path:包括路径的完整文件名,如(/home/maxin/);
oflags:文件访问模式, 如(O_RDONLY、O_WRONLY);
mode:用于设定文件的访问权限,如(0666)。
open建立了一条到文件或设备的访问路径,如果调用成功,返回一个可以被read、write等其他系统调用的函数使用的文件描述符,而且这个文件描述是唯一的,不与任何其他运行中的进程共享,在失败时返回-1,并设置全局变量errno来指明失明的原因。
2) write
函数原型
size_t write(int fildes, const void *buf, size_t nbytes);
write的作用是把缓冲区buf的前nbytes个字节写入到文件描述符fildes关联的文件中,返回实际写入的字节数。返回0表示没有写入任何数据,返回-1表示调用中出现了错误,错误代码保存在errno中。
注:fildes一定要是在open调用中返回的创建的文件描述符,或者是0、1、2等标准输入、输出或标准错误。
3) read
函数原型
size_t read(int fildes, void *buf, size_t nbytes);
read系统调用的作用是从与文件描述符相关的文件里读入nbytes个字节的数据,并把它们放到数据区buf中,返回读入的字节数,失败时返回-1。
4) close
函数原型
int close(int fildes);
close函数的作用是终于文件描述符fildes一其对应的文件之间的关联。
3.示例:文件copy
1 #include <stdio.h> 2 #include <assert.h> 3 #include <string.h> 4 #include <fcntl.h> 5 #include <unistd.h> 6 7 int main(int argc, char * argv[]) 8 { 9 int fpr, fpw, res; 10 int buf[100]; 11 // 打开文件 12 fpr = open(argv[1], O_RDONLY, 0600); 13 fpw = open(argv[2], O_WRONLY|O_CREAT, 0600); 14 assert(fpr != -1 && fpw != -1); 15 // 文件copy 16 memset(buf, 0, sizeof(buf)); 17 while((res = read(fpr, buf, 100)) > 0) 18 { 19 write(fpw, buf, res); 20 } 21 // 关闭文件 22 close(fpw); 23 close(fpr); 24 return 0; 25 }
二、标准I/O库
在标准I/O库中,与底层文件描述符相对应的是流,它被实现为指向结构FILE的指针。
1.I/O常用库函数
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所指向的缓冲区中。返回值是成功读到缓冲区中的记录个数。
3)fwrite库函数
函数原型
size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream);
它与底层调用write相似,其作用是从ptr指向的缓冲区中读取nitems个长度为size到数据,
并把它们写到stream所对应的文件中。
4)fclose库函数
函数原型
int fclose(FILE *stream);
它与系统调用close相似,其作用是关闭指定的文件流stream。
2.示例:文件拷贝
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <assert.h> 5 6 int main(int argc, char * argv[]) 7 { 8 int buf[100]; 9 int res = 0; 10 FILE * fpr = NULL; 11 FILE * fpw = NULL; 12 13 fpr = fopen(argv[1], "r"); 14 fpw = fopen(argv[2], "w"); 15 assert(fpr != NULL && fpw != NULL); 16 17 memset(buf, 0, sizeof(buf)); 18 while((res = fread(buf, sizeof(char), 100, fpr)) > 0) 19 { 20 fwrite(buf, sizeof(char), res, fpw); 21 } 22 fclose(fpr); 23 fclose(fpw); 24 25 return 0; 26 }
标签:
原文地址:http://www.cnblogs.com/maxin/p/5744834.html