上篇讲解了通过系统调用实现文件编程,本篇通过c函数库实现文件编程。
一、库函数方式文件编程的优点:
基于C函数库的文件编程是独立于具体的操作系统的,不管是在windows,linux,还是其他的操作系统中,都是使用这些函数。使用库函数进行程序设计可以提高程序的可移植性。
二、两个重要的概念:
流:对于标准的C函数库,他们的操作都是围绕流来进行的。流是一个抽象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。
文件指针:在系统调用方式实现的文件访问中,使用文件描述符(一个非负整数)来指向一个文件。在库函数方式的文件访问中,使用FILE类型来表示一个打开的文件,这个类型中包含了管理文件流的信息。而指向该类型的指针FILE * 则被称之为文件指针。
二、函数编程的函数说明
-
打开文件:fopen 函数原形 FILE *fopen(const char *path, const char *mode) 函数功能 打开文件 头文件 #include《stdio.h》 返回值 成功:返回文件指针; 失败:NULL 参数说明 path 文件路径 mode 打开文件的模式,r,r+,w,w+,a -
关闭文件:fclose 函数原型 int fclose(FILE *fp); 函数功能 关闭一个打开的文件 头文件 #include《stdio.h》 返回值 成功:0; 失败:EOF 参数说明 fp: 待关闭的文件指针; -
读文件:fread 函数原型 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *steam); 函数功能 从文件中读取数据; 头文件 #include《stdio.h》 返回值 成功:返回成功读取到的数据量 ; 失败:0 参数说明 ptr: 要保存的数据位置; size: 每块数据的大小; nmemb: 读取的数据块数; steam: 希望读取的文件的文件指针; -
写文件:fwrite 函数原型 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 函数功能 往一个打开的文件写入数据; 头文件 #include《stdio.h》 返回值 成功:返回成功写入的数据量 ; 失败:0 参数说明 ptr: 存放想要写入文件的数据; size: 每块数据的大小; nmemb: 读取的数据块数; steam: 希望写入的文件的文件指针; -
文件定位:fseek 函数原型 int fseek(FILE *stream, long offset, int whence); 函数功能 设置文件的位置指针; 头文件 #include《stdio.h》 返回值 成功:0 ; 失败:-1; 参数说明 stream: 要重新定位的文件指针; offset: 相对于第三个参数的偏移量; whence: 文件指针相对于文件的位置。
三、文件编程例子:
-
功能 从一个文件的内容中任意位置,插入自己想要的内容 代码
#include <stdio.h>
int main( int argc , char **argv ){
FILE *file_f = fopen( "/home/nan/test/tea.txt" , "r+" ) ;
FILE *file_t = fopen( argv[2] , "a+" ) ;
char buf[100] ;
int size = 0 ;
int nmember = 0 ;
if( !file_f ){
printf("from open fail\n") ;
return -1 ;
}
if( !file_t ) {
printf("write open fail!\n") ;
return -1 ;
}
while( nmember=fread(buf,sizeof(char),100,file_f) ) {
nmember = fwrite( buf , sizeof(char), nmember , file_t ) ;
if( !nmember ) {
printf("write fail!\n") ;
return -1 ;
}
}
return 0 ;
}