库函数:所谓库函数,就是独立于操作系统的,为提高程序的可移植性而生的一种方式。
无论在什么操作系统上都可以使用这些函数。
流: 上节课的 【Linux系统调用】文件编程 的操作方式为I/O文件操作,这是C提供的一种文件操作,它是通过直接存取文件来完成对文件的处理。
而今天的这课是流式文件操作,流是标准的c函数库里的一个抽象概念。当我们读写数据时,就会开启一个流,这个流可以通向文件、内存、
网络连接等,数据可以‘流’向目的地。
文件指针:在系统调用中使用文件描述符来指向一个文件,这是I/O操作的实现方式。同理,在流式文件操作中,使用
一、函数学习:fopen,fclose,fread,fwrite,fseek。文件指针来指向一个打开的文件,类型为FILE*.
二、最佳实践:编写copy程序
一、函数学习
1、fopen: 打开流
1)函数原型
FILE *fopen(const char *path, const char *mode);
2)所属头文件
#include
3)返回值
成功: 返回文件指针
失败: NULL
4)参数说明
path: 包含路径的文件名(可以是相对路径或绝对路径)
mode: 打开模式
*r: 只读
*r+: 可读可写
*w: 若文件存在, 清空文件内容; 若文件不存在,新建文件,只写
*w+: 若文件存在,清空文件内容;若文件不存在,新建文件,可读可写
*a: 以追加方式打开文件(追加内容写在文件尾),若文件不存在,新建一 个文件
*a+: 以可读、追加方式打开文件. 读文件的初始位置为文件头, 追加到的位置为文件尾.
#include
void main()
{
FILE *fptr = NULL;
if ( NULL == (fptr = fopen("./fopen-file", "r")) )
{
printf("Can not open the file !\n");
return;
}
fclose(fptr);
}
1)函数原型
size_t fread(void *ptr, size_t size, size_t nmenb, FILE *stream);
2)所属头文件#include
3)返回值成功: 成功读取的元素个数
失败: 0
4)参数说明
ptr: 存储读取数据的指针
size: 每个元素的字节数
nmenb: 读取的元素个数
stream: 待读取的文件指针
#include
void main()
{
FILE *fp = NULL;
char buf[100];
int num_items = 0;
fp = fopen("./fread-file", "r");
num_items = fread(buf, 1, 100, fp);
buf[num_items] = '\0';
printf("# %d is read: %s\n", num_items, buf);
close(fp);
}
3、fclose: 关闭流
1)函数原型
int fclose(FILE *fp);
2)所属头文件
#include
3)返回值
成功: 0
失败: EOF (End Of File, 文件尾)
4)参数说明
fd: 待关闭的文件指针
4、fwrite: 写数据
1)函数原型
size_t fwrite(const void *ptr, size_t size, size_t nmenb, FILE *stream);
2)所属头文件
#include
3)返回值
成功: 成功写入的元素个数
失败: 0
4)参数说明
ptr: 存储待写入数据的指针
size: 每个元素的字节数
nmenb: 待写入的元素个数
stream: 待写入的文件指针
#include
void main()
{
char *str = "I love linux";
FILE *fp;
fp = fopen("./fwrite-file", "w+");
fwrite(str, 2, 5, fp);
close(fp);
}
5、fseek: 定位文件流的偏移量
1)函数原型
int fseek(FILE *stream, long offset, int whence);
2)所属头文件
#include
3)返回值
成功: 0
失败: -1
4)参数说明
stream: 文件指针
offset: 偏移量
whence: 偏移位置(SEEK_SET, SEEK_CUR, SEEK_END, 详细可看上一篇文章)
二、最佳实践:copy程序
#include
void main(int argc, char* argv[])
{
FILE *fp_src = NULL;
FILE *fp_dest = NULL;
int count = 0;
char buf[65];
/* 1. Open source and destination files. */
if ( NULL == (fp_src = fopen(argv[1], "r")) )
{
puts("ERROR: File is not exist or can not open.");
return;
}
if (NULL == (fp_dest = fopen(argv[2], "w")) )
{
puts("ERROR: Can not creat dest-file.");
return;
}
/* 2. Copy data. */
while ( (count = fread(buf, 1, 64, fp_src)) > 0)
{
fwrite(buf, 1, count, fp_dest);
}
/* 3. Close source and destinatin files. */
fclose(fp_dest);
fclose(fp_src);
}