【文件 part 6 - 格式化读写文件函数 & 随机读写】

格式化读写文件函数

/* 函数调用:  */
fprintf ( 文件指针,格式字符串,输出表列);
fscanf ( 文件指针,格式字符串,输入表列);

/** 函数功能:
 *  	从磁盘文件中读入或输出字符
 * fprintf 和printf函数类似:
 *		printf是将数据输出到屏幕上(标准输出),
 *		fprintf函数是将数据输出到文件指针所指定的文件中。
 *
 * fscanf和scanf 函数类似:
 *		scanf是从键盘(标准输入)获取输入,
 *		fscanf是从文件指针所标示的文件中获取输入。
 */
#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE *fp;
	char ch1 = 'a', ch2;
	int num1 = 50, num2;
	char string1[20] = "hello", string2[20];
	float score1 = 85.5, score2;

	if((fp = fopen("C:/Users/lzx/Desktop/file.txt","w+"))==NULL)
	{
		printf("fail to fopen\n");
		return1;
	}

	//使用fprintf向文件写入字符串
	fprintf(fp,"%c %d %s %f\n",ch1,num1,string1,score1);

	rewind(fp);

	//使用fscanf获取文件内容
	fscanf(fp,"%c %d %s %f\n",&ch2,&num2,&string2,&score2);
	printf("%c %d %s %f\n",ch2,num2,string2,score2);

	fclose(fp);
	return 0;
}

执行结果
在这里插入图片描述
在这里插入图片描述

随机读写

前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据;但在实际问题中常要求只读写文件中某一指定的部分,例如:读取文件第200–300个字节。为了解决这个问题可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。

rewind

#include <stdio.h>
void rewind(FILE *stream);
/* 功能:将文件位置定位到起始位置
 * 参数:
 * 	stream:文件指针
 * 返回值:无
 * /

ftell

#include <stdio.h>
long ftell(FILE *stream);
/* 功能:获取当前文件的偏移量
 * 参数:
 * 	stream:文件指针
 * 返回值:
 * 	获取当前文件的偏移量
 * /

fseek

#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
/* 功能:设置文件位置指针的偏移量
 * 参数:
 * 		stream:文件指针
 * 		offset:偏移量
 * 				可正可负也可为0
 * 		whence:相对位置
 * 		SEEK_SET 文件起始位置
 * 		SEEK_CUR 文件当前位置
 * 		SEEK_END 文件末尾位置(最后一个字符后面一个位置)
 * 返回值:
 * 		成功:0
 * 		失败:‐1
 */ 		
rewind(fp) <==> fseek(fp, 0, SEEK_SET);
#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE *fp;
	if((fp = fopen("C:/Users/lzx/Desktop/file.txt","w+"))==NULL)
	{
		printf("fail to fopen\n");
		return1;
	}

	fputs("123456789\n", fp);
	fputs("abcdefghijklmn", fp);

	//获取当前文件指针的读写位置
	printf("offset = %ld\n", ftell(fp));
	
	//将当前文件的读写文件设置到文件的起始位置
	//rewind(fp);
	//fseek(fp, 0, SEEK_SET);

	//将当前文件的读写位置设置为倒数第五个位置
	fseek(fp,5, SEEK_END);

	char buf[32] = "";
	while(fgets(buf, 32, fp) != NULL)
	{
		printf("[%s]\n", buf);
	}

	return 0;
}

执行结果
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

六月悉茗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值