C语言的文件操作(二)

顺序读写的函数解读

一:字符输入输出函数

1. fputc

函数功能:将字符写入流(函数调用一次,使用一个字符)

函数原型:
int fputc ( int character, FILE * stream );

  1. character:要写入的字符的int提升。
    写入时,该值在内部转换为无符号字符
  2. FILE * stream:指向标识输出流的FILE对象的指针(就是所使用的文件指针)
#include <stdio.h>

int main()
{
	//打开文件
	//"w"表示如果没有该文件 创建一个文件
	FILE* pf = fopen("test.txt", "w");
	//判断是否创建成功
	if (pf == NULL)
	{
		perror("fopen:");
		return;
	}

	//写文件
	fputc('c', pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

运行结果
在这里插入图片描述
在这里插入图片描述
创建出的文件和输到文件里面的数据

fgetc 和 fputc 使用了一次都会改变文件指针指向的位置,都是向后移动一个单位

2.fgetc

函数功能:从流中获取字符(函数调用一次,使用一个字符)

函数原型:int fgetc ( FILE * stream );

FILE * stream:指向标识输入流的FILE对象的指针(就是所使用的文件指针)

int main()
{
	//打开文件
	//r代表只读文件,
	//如果没有该文件,则会打开失败
	FILE* pf = fopen("test.txt", "r");

	//判断文件是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	//读文件
	//因为fgetc会返回 int 
	//可以使用链式访问
	printf("%d\n", fgetc(pf));

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

目标文件:
在这里插入图片描述
运行结果
在这里插入图片描述
打印99的原因是 ‘c’ 的ASCII值为99

注: 在 cpluscplus.com 网站中对 fgetc返回值的描述:

成功时,函数返回字符(并将其提升为int值)
原因是,用来适应特殊值EOF来表示失败
通过这种描述,当文件数据过多时,就有优化代码的思路

#include <stdio.h>

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");

	//判断是否打开成功
	if (pf == NULL)
	{
		perror("fopen:");
		return;
	}

	//读文件
	int c = 0;
	while ((c = fgetc(pf)) != EOF)//当返回值正确时进入循环
	{
		//这里使用 %c 就可以打印字符型
		printf("%c", c);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

文件内容
在这里插入图片描述
运行结果
在这里插入图片描述

二:文本行输入输出函数

1.fputs

函数功能:写一个字符串到流中,一行一行的写入

函数原型:
int fputs ( const char * str, FILE * stream )

str : 包含要写入流的内容的字符串

stream : 指向标识输出流的FILE对象的指针(文件指针)

#include <stdio.h>

int main()
{
	//定义一个字符串数组
	char str[] = "abcedfghi";

	//打开文件
	FILE* pf = fopen("test.txt", "w");
	
	//判断是否打开失败
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	//写文件
	fputs(str, pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

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

2.fgets

函数功能 : 从流中得到一个字符串

函数原型 : char * fgets ( char * str, int num, FILE * stream )

str : 指向复制读取字符串的字符数组的指针

num : 要复制到str中的最大字符数(包括终止的空字符

stream : 指向标识输入流的FILE对象的指针(文件指针)

#include <stdio.h>

int main()
{
	//创建一个字符串来接收
	char str[20] = { 0 };

	//打开文件
	FILE* pf = fopen("test.txt", "r");

	//判断是否打开失败
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	//读文件
	fgets(str, 7, pf);
	printf("%s\n", str);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

目标文件:
在这里插入图片描述
运行结果
在这里插入图片描述
上述两图可以发现,应该拷贝 7 个字符,但最后只有 6 个字符, 其中的原因是应该拷贝的最后一个字符 ‘g’ 被改变成 ‘\0’ 。
所以在使用时, 需要注意这点。

三:格式化输入输出函数

1. fprintf

函数功能 : 将格式化数据写入流(写文件指针)

函数原型 : int fprintf ( FILE * stream, const char * format, … )
这时,我们可以类似 printf 的函数原型
int printf ( const char * format, … )
就会发现 fprintf函数 比 printf函数的参数多了个文件指针,其余不变。

因为fprintf不像前面几个函数,只能用字符,所以这里用结构体来举例

#include <stdio.h>

struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "lisi", 20, 90.0 };
	//打开文件
	FILE* pf = fopen("test.txt", "w");

	//判断是否打开成功
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	//写文件
	fprintf(pf, "%s %d %.1f", s.name, s.age, s.score);


	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

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

2.fscanf

函数功能 : 从流中读取格式化数据

函数原型 : int fscanf ( FILE * stream, const char * format, … )
参数和fprintf大同小异,也和fgets一样需要定义一个变量来接收读取到数据

#include<stdio.h>

struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };
	//打开文件
	FILE* pf = fopen("test.txt", "r");

	//判断是否打开失败
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	//读文件
	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
	printf("%s %d %.1f", s.name, s.age, s.score);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

目标文件
在这里插入图片描述
运行结果
在这里插入图片描述

四:二进制输入输出函数

1.fwirte

函数功能 : 将数据块写入流

函数原型 : size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream )

ptr : 指向要写入的元素数组的指针,转换为常量void*
size : 元素的大小
count : 元素的个数
stream : 流
fopen中的 打开方式要改为 " xb"的形式(x可以为 r,w,a)。

#include<stdio.h>

int main()
{
	int str[] = { 1,2,3,4,5,6,7,8,9,10 };
	//打开文件
	//使用二进制输入输出时,打开的方式也要改为二进制
	FILE* pf = fopen("test.txt", "wb");

	//判断
	if (pf == NULL)
	{
		perror("fopen:");
		return;
	}

	写文件
	fwrite(str, sizeof(int), 4, pf);


	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

运行结果
在这里插入图片描述
因为是二进制的输入输出,所以使用 .txt 方式打开为我们所看到的乱码,但对于计算机结果是不变的。

2.fread

函数功能 : 从流中读到数据块

函数原型 : size_t fread ( void * ptr, size_t size, size_t count, FILE * stream )

ptr : 指向大小至少为(size * count)字节的内存块的指针
size : 一个元素的大小
count : 元素的数量
stream : 流

#include <stdio.h>

int main()
{
	int str[20] = { 0 };
	
	//打开文件
	FILE* pf = fopen("test.txt", "rb");
	
	//判断
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}

	//读文件
	fread(&str, sizeof(int), 4, pf);
	
	//这里我们自己设置的是读4个元素
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		printf("%d ", str[i]);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

目标文件
在这里插入图片描述
运行结果
在这里插入图片描述
这就是C语言文件操作中顺序读写的函数讲解内容,感谢大家的阅读,让我们一起努力变强吧!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值