Clibrary | 【06】文件指针操作函数

前言

以下是<cstdio>对文件指针操作的函数。

1、fread

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

/*
* @func:从流中读取数据块;
* @param ptr:指向大小至少为(size*count)字节的内存块的指针,转换为void*;
* @param size:(size_t)要读取的每个元素的大小;
* @param count:(size_t)元素的数量,每个元素的大小为size字节;
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回读取元素总数;若size或count为0,则返回0;
*/

案例

void Demo_fread(){
	char buf[100] = {0};
	FILE *fp = fopen("test.txt", "r");

	/* 获取文件大小 */
	fseek(fp, 0, SEEK_END);  
	int size = ftell(fp);
	rewind(fp);

	/* 读取文件 */
	fread(buf, size, sizeof(char), fp);
	printf(buf);
	fclose(fp);
}

2、fwrite

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

/*
* @func:将数据块写入流;
* @param ptr:指向要写入的元素数组的指针,转换为const void*;
* @param size:(size_t)要读取的每个元素的大小;
* @param count:(size_t)元素的数量,每个元素的大小为size字节;
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回读取元素总数;若size或count为0,则返回0;
*/

案例

void Demo_fwrite(){
	char *buf = "T like...";

	FILE *fp = fopen("test.txt", "w");

	/* 写入文件 */
	fwrite(buf, strlen(buf), sizeof(char), fp);

	fclose(fp);
}

3、fgetpos

int fgetpos ( FILE * stream, fpos_t * pos );  

/*
* @func:获取流中的当前位置;
* @param pos :指向fpos_t对象的指针(已分配),传出参数;
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回0,错误返回非0值;
*/

案例

void Demo_fgetpos(){
	fpos_t pos;	 // 定义传出参数
	FILE *fp = fopen("test.txt", "r");

	fgetpos(fp, &pos); // 获取指针

	printf("文件指针当前位置:%d\n", pos);
	fclose(fp);
}

4、fseek

int fseek ( FILE * stream, long int offset, int origin );

/*
* @func:重新定位流位置指示器;
* @param origin:
		SEEK_SET	文件开头
		SEEK_CUR	文件指针的当前位置
		SEEK_END	文件结束 *
* @param offset:
* 		二进制文件:从origin偏移的字节数。
*		文本文件:零或ftell返回的值。
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回0,错误返回非0值;
*/
注意:库允许实现无意义地支持SEEK_END(因此,使用它的代码没有真正的标准可移植性)

案例

void Demo_fseek(){
	fpos_t pos;
	FILE *fp = fopen("test.txt", "w+");
	
	for (char ch = 'A'; ch < 'K'; ++ch){
		if (ch == 'C'){
			// 设置文件指针会到开头
			fseek(fp, 0, SEEK_SET);
			printf("文件指针回溯...\n");
		}
		fputc(ch, fp);  // 写入文件
		fgetpos(fp, &pos);	// 获取文件指针当前位置
		printf("文件指针当前位置:%d\n", pos);
	}

	printf("文件指针当前位置:%d\n", pos);
	fclose(fp);
}

5、fsetpos

int fsetpos ( FILE * stream, const fpos_t * pos );

/*
* @func:设置流的位置指示器;
* @param pos :指向包含先前使用fgetpos获得的位置的fpos_t对象的指针;
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回0,错误返回非0值;
*/

案例

void Demo_fsetpos(){
	fpos_t pos;
	FILE *fp = fopen("test.txt", "w+");

	for (char ch = 'A'; ch < 'K'; ++ch){
		if (ch == 'C'){  
			fgetpos(fp, &pos);	// 获取文件指针当前位置
			printf("已获取文件指针%d\n", pos);
		}
		if (ch == 'E'){  // 当字符为E时重新设置指针到C,写入,因此C到E间的字母会被覆盖
			printf("重新设置文件指针...\n");
			fsetpos(fp, &pos);
		}
		fputc(ch, fp);  // 写入文件
	}

	fclose(fp);
}

6、ftell

long int ftell ( FILE * stream );

/*
* @func:获取流中的当前位置;
* @param stream:指向指定输入流的FILE对象的指针;
* return:成功返回指示器当前位置,错误返回-1L;
*/

案例

void Demo_fread(){
	char buf[100] = {0};
	FILE *fp = fopen("test.txt", "r");

	/* 获取文件大小 */
	fseek(fp, 0, SEEK_END);  // 将文件指针设置到文件末尾
	int size = ftell(fp); // 返回位置指示器的当前值
	rewind(fp);		// 将文件指针设置会开头位置

	/* 读取文件 */
	fread(buf, size, sizeof(char), fp);
	printf(buf);
	fclose(fp);
}

7、rewind

void rewind ( FILE * stream );
/*
* @func:将流的位置设置为开头;
* @param stream:指向指定输入流的FILE对象的指针;
*/

案例

void Demo_fread(){
	char buf[100] = {0};
	FILE *fp = fopen("test.txt", "r");

	/* 获取文件大小 */
	fseek(fp, 0, SEEK_END);  // 将文件指针设置到文件末尾
	int size = ftell(fp); // 返回位置指示器的当前值
	rewind(fp);		// 将文件指针设置会开头位置

	/* 读取文件 */
	fread(buf, size, sizeof(char), fp);
	printf(buf);
	fclose(fp);
}

8、perror

void perror ( const char * str );

/*
* @func:打印错误信息;
* @param str :产生错
* `在这里插入代码片`误信息相关;
*/

案例

void Demo_perror(){
	FILE *fp = fopen("test1.txt", "r");

	if (fp == NULL){
		perror("file open");
	}else{
		fclose(fp);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值