【C语言】文本操作函数fgetc、fputc、fgets、fputs、fprintf、fscanf、fread、fwrite

一、介绍

二、简要概括

三、函数的使用 

1、fgetc和fputc

int fgetc ( FILE * stream ); 

从文件中读取信息,每次读取一个字符

  • 从流中获取字符
  • 返回指定流的内部文件位置指示符当前指向的字符。然后将内部文件位置指示符推进到下一个字符
int main()
{
	//打开文件
	FILE * pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//读文件
	int ch = fgetc(pf);
	printf("%c", ch);

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

	return 0;
}



int fputc ( int character, FILE * stream );

从建盘中输入信息到文件中,每次输入一个字符

  • 将字符写入流
  • 将一个字符写入流并推进位置指示器
  • 字符被写入流的内部位置指示器所指示的位置,然后自动向前移动一个
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件
	fputc("a", pf);

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

	return 0;
}

2、fgets和fputs

char * fgets ( char * str, int num, FILE * stream );

从文件中读取信息,每次读取一个字符串

  • 从流中获取字符串
  • 从流中读取字符,并将其作为C字符串存储到 str 中,直到读取 (num-1) 个字符,或者到达换行符或文件结束符
  • 换行符使 fgets 停止读取,但它被函数认为是一个有效字符,并包含在复制到 str 的字符串中。
  • 在复制到 str 的字符之后,将自动追加一个终止 null 字符。
  • 请注意,fgets 与 gets 有很大的不同:fgets 不仅接受流参数,而且允许指定 str 的最大长度,并在字符串中包含任何结束换行符
int main()
{
	//打开文件
	FILE * pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//读文件
	char arr[100] = { 0 };
	fgets(arr,5, pf);
	printf("%s", arr);

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

	return 0;
}


int fputs ( const char * str, FILE * stream );

从建盘中输入信息到文件中,每次输入一个字符串

  • 将字符串写入流
  • 将由 str 指向的C字符串写入流
  • 函数从指定的地址 (str) 开始复制,直到到达结束的空字符 ('\0'),这个终止的空字符不会复制到流中
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

	//写文件
	fputs("abcde\n", pf);

	char arr[10] = "efghi";
	fputs(arr, pf);

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

	return 0;
}

3、fprintf和fscanf

int fprintf ( FILE * stream, const char * format, ... );

将有格式的数据转换为字符串并且写入文件

  • 将格式化的数据写入流
  • 将由 format 指向的 C字符串写入流。如果 format 包含格式说明符(以%开头的子序列),则格式化format 之后的其他参数并将其插入到结果字符串中,以替换它们各自的说明符。
struct S
{
	char name[10];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan",18,94.5};
	FILE* pf = fopen("data.txt", "w");

	//打开文件
	
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

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

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

	return 0;
}

int fscanf ( FILE * stream, const char * format, ... );

将文件中的字符串转换为有格式的数据并且读取出来

  • 从流中读取格式化的数据
  • 从流中读取数据,并根据参数格式将其存储到附加参数所指向的位置
  • 额外的参数应该指向已经分配的对象,其类型由格式字符串中相应的格式说明符指定
struct S
{
	char name[10];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };
	FILE* pf = fopen("data.txt", "r");

	//打开文件
	
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}

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

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

	return 0;
}

4、fread和fwrite

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

将文件中的内容转换为二进制然后读取出来

  • 从流中读取数据块
  • 从流中读取一个由 count 元素组成的数组,每个元素的大小为 size 字节,并将它们存储在 ptr 指定的内存块中
  • 流的位置指示器按读取的总字节数前进
  • 如果成功读取的总字节数为 (size*count) 
  • 以二进制的方式读取文件
//二进制的方式读取文件
int main()
{
	int arr[10] = {0};
 
	//写文件
	FILE* pf = fopen("data.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
 
	//二进制的读文件
	fread(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);
 
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
 
	//关闭文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

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

将数据转换为二进制然后写入文件

  • 将数据块写入流
  • 将由 count 元素组成的数组 (每个元素的大小为 size 字节) 从 ptr 所指向的内存块写入流中的当前位置
     
  • 流的位置指示器按写入的总字节数前进
  • 在内部,该函数将 ptr 指向的块解释为 unsigned char 类型的 (size*count) 元素数组,并将它们顺序写入流,就像对每个字节调用 fputc 一样
//二进制的方式写进文件
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
 
	//写文件
	FILE*pf = fopen("data.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
 
	//二进制的写文件
	fwrite(arr, sizeof(arr[0]), sizeof(arr)/sizeof(arr[0]), pf);
 
	//关闭文件
	fclose(pf);
	pf = NULL;
 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值