C语言文件操作

1.文件介绍

文件是以计算机硬盘为载体存储在计算机上的信息集合。是数据源的一种,最主要的作用是保存数据。

2.文件操作符

在这里插入图片描述
在这里插入图片描述
再此我们介绍r,w,r+

3.实操

文件内容为:

在这里插入图片描述

1.寻找文件路径

在这里插入图片描述
寻找文件属性中的位置,在后面加上文件名即为文件路径

2.打开文件

FILE* fp=fopen("C:\\Users\\19055\\Desktop\\text.txt","r");

这个是普通的打开操作,以后的读取都在文件指针fp上进行操作

FILE* fp=fopen("C:\\Users\\19055\\Desktop\\text.txt","w");

这个是写入文件操作,w清空之后进行写入,在打开的时候进行清空

FILE* fp=fopen("C:\\Users\\19055\\Desktop\\text.txt","r+");

r+可读可写
注意.打开记得关闭fclose(fp);

3.文件读取

1.fgetc()函数
fgetc()函数读取完之后都会将文件指针向后偏移一个位置,且该函数一次只读取一个字符

	char ch ;
	ch = fgetc(fp);
	printf("%c",ch);

在这里插入图片描述

问:如何用fgetc()函数将文件内容全部读取

	char ch ;
	ch = fgetc(fp);
//	EOF 为读取结束判断标志
	while((ch = fgetc(fp))!=EOF)
	{
		printf("%c",ch);
	}

在这里插入图片描述

2.fgets()函数
fgets()读取完一行后读到下一行的开头 fgets()返回值为一个指针,读不到时返回NULL,即每次读取一行,所以应该用字符数组进行操作

	char str[200]={0};
	memset(str,0,sizeof(str)); //字符串清零
	fgets(str,200,fp);
	printf("%s",str);

在这里插入图片描述
问:如何用fgets()函数读取文件全部内容

	char str[200]={0};
	//fgets()读取完一行后读到下一行的开头  fgets()返回值为一个指针,读不到时返回NULL
	while(fgets(str,200,fp))
	{
		printf("%s",str);
	}

在这里插入图片描述
3.fread()函数
fread() 返回值为实际读取的个数

	char str[200]={0};
	fread(str,1,2,fp);
	printf("%s",str);
	while(fread(str,1,100,fp))
	{
		printf("%s",str);
	}

在这里插入图片描述

4.文件写入操作

1.首先将打开方式改为w
2.fputc()
写入一个字符

fputc('A',fp);

文件内容发生改变
在这里插入图片描述
3.fputs()
写入字符串

	char* str="编译结果...";
	fputs(str,fp); //第一位的变量是地址变量
	fputs("\n编译结果...",fp);

编译运行后的结果是:
在这里插入图片描述
直接在上面fputc()运行之后运行的结果是:
在这里插入图片描述
由此可见,文件清空操作只发生了一次,就是文件打开时进行一次
4.fwrite()

	char* str="123456789";
	fwrite(str,sizeof(str),1,fp);//类型字节数,第三个变量是输入多少个单位,第一个变量是存放的地址

在这里插入图片描述
fwrite()在进行写入时,要控制写入的字节数,所以在这里只写入了1234
问:如何将结构体写入到文件中

typedef struct people1
{
	char name[20];
	char sex[20];
}people;
	FILE* fp=fopen("C:\\Users\\19055\\Desktop\\text.txt","w");
	people a={"张三","男"};
	fwrite(&a,sizeof(a),1,fp);

在这里插入图片描述

5.文件指针前后移动

注释:接下来的操作以r+打开

	fseek(fp,10,SEEK_SET);//指针定位函数,SEEK_SET是初始位置
	char str[200]={0};
	fread(str,1,20,fp);
	printf("%s\n",str);
	fseek(fp,6,SEEK_CUR);//SEEK_CUR是当前位置,第二项改为负数是倒退指针位置
	fread(str,1,100,fp);
	printf("%s\n",str);	
	fseek(fp,-6,SEEK_END);//SEEK_END是从末尾开始移动
	fread(str,1,100,fp);
	printf("%s\n",str);	

在这里插入图片描述
函数第二个变量若是整数则向后移动,若是负数则向前移动
如何结合fseek()函数读取最后一行字符

//读取文件最后一行
	fseek(fp,-1,SEEK_END);
	char ch=0;
	int a=0;
	while(fread(&ch,1,1,fp))
	{
		if(ch == '\n')
		{
			break;
		}
		fseek(fp,-2,SEEK_CUR);
		a++;
	}
	printf("a=%d\n",a);
	fseek(fp,-a,SEEK_END);

	char* bu=malloc(sizeof(char)*a+1);//不知道最后一行的字符数,应建立动态数组
	memset(bu,0,a+1);
	fread(bu,1,a,fp);
	printf("%s\n",bu);
	free(bu);

在这里插入图片描述
注意:该操作是识别换行符进行结束,文件最后应无换行符,在最后注意删除

4.补充

rewind(fp);//文件指针重置到文件的开头

5.关于中文字符读取错误的解决办法

在这里插入图片描述有时我们读取时会遇到这种情况,这是由于txt文件在保存时,Windows默认编码类型不是ascii型,解决此类问题的方法如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就将文件编码形式改为了ASCII形式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值