【Linux库函数编程】文件编程

库函数:所谓库函数,就是独立于操作系统的,为提高程序的可移植性而生的一种方式。

无论在什么操作系统上都可以使用这些函数。


流:    上节课的 【Linux系统调用】文件编程 的操作方式为I/O文件操作,这是C提供的一种文件操作,它是通过直接存取文件来完成对文件的处理。 

而今天的这课是流式文件操作,流是标准的c函数库里的一个抽象概念。当我们读写数据时,就会开启一个流,这个流可以通向文件、内存、

网络连接等,数据可以‘流’向目的地。


文件指针:在系统调用中使用文件描述符来指向一个文件,这是I/O操作的实现方式。同理,在流式文件操作中,使用

文件指针来指向一个打开的文件,类型为FILE*.


一、函数学习:fopen,fclose,fread,fwrite,fseek。

二、最佳实践:编写copy程序


一、函数学习


1、fopen: 打开流

1)函数原型

        FILE *fopen(const char *path, const char *mode);

2)所属头文件

        #include <stdio.h>

3)返回值

        成功: 返回文件指针

        失败: NULL

4)参数说明

        path: 包含路径的文件名(可以是相对路径或绝对路径)

        mode: 打开模式

                *r: 只读

                *r+: 可读可写   

                *w: 若文件存在, 清空文件内容; 若文件不存在,新建文件,只写

                *w+: 若文件存在,清空文件内容;若文件不存在,新建文件,可读可写

                *a: 以追加方式打开文件(追加内容写在文件尾),若文件不存在,新建一 个文件

                *a+: 以可读、追加方式打开文件. 读文件的初始位置为文件头, 追加到的位置为文件尾.


#include <stdio.h>


void main()
{
	FILE *fptr = NULL;

	if ( NULL == (fptr = fopen("./fopen-file", "r")) )
	{
		printf("Can not open the file !\n");
		return;
	}

	fclose(fptr);
}



2、fread: 读数据

1)函数原型

        size_t fread(void *ptr, size_t size, size_t nmenb, FILE *stream);
2)所属头文件

        #include <stdio.h>
3)返回值

        成功: 成功读取的元素个数

        失败: 0

4)参数说明

        ptr: 存储读取数据的指针

        size: 每个元素的字节数

        nmenb: 读取的元素个数

        stream: 待读取的文件指针


#include <stdio.h>

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 <stdio.h>

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 <stdio.h>

3)返回值

        成功: 成功写入的元素个数

        失败: 0

4)参数说明

        ptr: 存储待写入数据的指针

        size: 每个元素的字节数

        nmenb: 待写入的元素个数

        stream: 待写入的文件指针


#include <stdio.h>

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 <stdio.h>

3)返回值

        成功: 0

        失败: -1

4)参数说明

        stream: 文件指针

        offset: 偏移量

        whence: 偏移位置(SEEK_SET, SEEK_CUR, SEEK_END, 详细可看上一篇文章)


二、最佳实践:copy程序


#include <stdio.h>

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);
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值