C文件操作

本文介绍了C语言中使用fread和fwrite进行二进制文件读写的基本操作,包括输入学生信息、保存到磁盘、读取并显示。示例代码展示了如何通过fread和fwrite读写结构体数组,以及如何使用fgetc和fputc读写字符。此外,还涉及到了字符串的读写以及文件复制功能。
摘要由CSDN通过智能技术生成

二进制形式读取:

fread和fwrite是以二进制的形式进行读取一组数据的

fread:

fread(数组地址,size,count,fp);

直接举一个例子说明:

fread(arr,4,10,fp):

表示从fp这个文件指针指向的文件中读取10个每一个大小为4个字节的数据项存放到arr这个数组中去。

fwrite:

fwrite(数组地址,size,count,fp)

二者的联系:

我总结一段话来概况一下:

我们通常对一组数据进行scanf输入之后,输入到我们的程序数据区(显示器)。

但是并没有存储到我们的磁盘文件中去。

这个时候我们就要通过fopen进行打开一个输出文件,用wb的形式进行打开

打开这个输出文件之后,

我们先用fwrite进行把scanf输入的数据进行输出,输出到磁盘文件中去。

对一个已经写好的磁盘文件中的数据进行读取出来的时候,我们要用到fread

fread通常用来检测fwrite是否已经完成了把scanf输入的数据输出到磁盘文件的这一步操作。

oK:接下来举例子说明:

 与文件操作有关的代码如下:

void input(struct student stu[N])
	{
		int i;
		for (i = 0; i < N; i++)
		{
			printf("请输入姓名");
			gets(stu[i].name);
			printf("请输入电话");
			gets(stu[i].phone);
			printf("请输入分数");
			scanf("%f", &stu[i].score);
			getchar();//吸收空格
		}
		//当我们把学生的数据输入到程序数据区之后,
		//我们需要通过fwrite进行输出写入到磁盘文件中去
		//因此调用save方法
		save(stu);
	}
	void save(struct student stu[N])
	{
		//1.先声明一个文件指针
		FILE* fp;
		int i;
		printf("==========================================");
		//2.以wb形式(即是以二进制只写的形式)打开fp指向的文件
		//w代表只写 b代表bit比特为二进制位
		fp = fopen("d:\\student.dat", "wb");
		//我们这里用到转义字符\\表示一个\
		
		if (fp == NULL)
		{
			printf("Cannot open the file!\n");
			exit(0);//表示退出
		}
		for (i = 0; i < N; i++)
		{
			fwrite(&stu[i], sizeof(struct student), 1, fp);
			fclose(fp);
			printf("The file has been saved successfully");
			printf("==========================================");
		}
	}
	//当储存到磁盘文件中之后,我们通过fread进行读取打印
	void display(struct student stu[N])
	{
		int i;
		FILE* fp;
		printf("==========================================");
		//注意这里打开文件的方式应该改正为 rb
		//r代表read b同上解释
		fp = fopen("d:\\student.dat", "rb");
		if (fp == NULL)
		{
			//如果为空,那么证明磁盘文件中没有存储数据
			printf("No data\n");
			return;
		}
		for (i = 0; i < N; i++)
		{
			fread(&stu[i], sizeof(struct student), 1, fp);
			printf("%-20s%-20s%-20.3f\n", stu[i].name, stu[i].phone, stu[i].score);
		}
		printf("==========================================");
		fclose(fp);
	}

读写单个字符:

我们用fgetc和fputc:

例题1:

从键盘输入一些字符,并逐个把它们送到磁盘中,直到用户输入一个#为止

#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE* fp;//定义一个文件指针
	char ch;
	char filename[10];//文件名
	printf("请输入一个文件名:");
	scanf("%s", &filename);
	getchar();
	//以只写的形式打开磁盘文件
	fp = fopen(filename, "w");
	//判断是否读取成功
	if (fp == NULL)
	{
		printf("cannot open the file");
		exit(0);
	}
	printf("请输入一个准备存储到磁盘的字符串(以#结束):");
	ch = getchar();
	while (ch != '#')
	{
		//把这个字符存储到fp指向的文件中去
		fputc(ch, fp);
		//在显示器上显示
		putchar(ch);
		//接收下一个单个字符
		ch = getchar();
	}
	fclose(fp);//关闭文件
	return 0;
}

例题2:

将一个磁盘文件中的信息复制到另外一个磁盘文件中。

要求比如(将file1.dat文件中的内容复制到另外一个磁盘文件file2.dat中)

解题思路:从file1.dat文件中逐个fgetc读入字符,然后逐个输出fputc到file2.dat中

#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE* fp1, fp2;//定义两个文件指针
	char ch, infile[10], outfile[10];
	printf("请输入输入文件的文件名");
	scanf("%s", &infile);
	printf("请输入输出文件的文件名");
	scanf("%s", &outfile);
	//只读,把数据从磁盘文件中读取出来输入到程序数据区
	fp1 = fopen(infile, "r");
	//只写,把数据从程序数据区输出出来到磁盘文件中
	fp2= fopen(outfile, "w");
	if (fp1 == NULL)
	{
		printf("无法打开此文件");
		exit(0);
	}
	if (fp2==NULL)
	{
		printf("无法打开此文件");
		exit(0);
	}
	//1.从fp1磁盘文件中读取一个字符出来输入到程序数据区
	ch = fgetc(fp1);
	//当读取到fp1指向的末尾时,返回EOF结束标记符
	while (!feof(fp1))
	{
		//2.把这个第一步读取的数据从程序数据区输出出来到fp2指向的磁盘文件中进行保存
		fputc(ch, fp2);
		putchar(ch);//将ch显示到屏幕上
		ch = fgetc(fp1);//继续读取fp1指向的磁盘文件的下一个数据
	}
	fclose(fp1);
	fclose(fp2);
	return 0;
}

读写一个字符串:

我们用 fgets和fputs

例子1:

第一问:

从键盘读入若干个字符串,对它们按照字母大小的顺序进行排序,然后把排好序的字符串送到磁盘文件中保存。

第二问:

从这个磁盘文件中进行读取,判断是否把数据已经存到该磁盘文件中?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	FILE* fp;
	char str[3][10], temp[10];
	int i, j, k, n = 3;
	printf("请输入字符串");
	for (i = 0; i < n; i++)
	{
		gets(str[i]);
	}
	//用选择法进行排序
	for (i = 0; i < n; i++)
	{
		k = i;
		for (j = 0; j < n - 1 - i; j++)
		{
			if (strcmp(str[j], str[k]) > 0)
			{
				k = j;
			}
		}
		if (k != i)
		{
			strcpy(temp, str[k]);
			strcpy(str[k], str[i]);
			strcpy(str[i], temp);
		}
	}
	FILE* fp;
	fp = fopen("D:\\leomessi.dat", "w");
	if (fp == NULL)
	{
		printf("打开文件失败");
		exit(0);
	}
	for (i = 0; i < n; i++)
	{
		//向fp这个文件指针指向文件中输出一个str[i]字符串以及一个换行符
		//
		//这个代码的意思就是:
		//把str[i]这个字符串输出到fp指向的磁盘文件中去
		fputs(str[i], fp);
		fputs("\n", fp);
		printf("%s", str[i]);
	}





	//2.
//从D:\\leomessi.dat这个文件中读取,判断是否把数据已经存到该磁盘文件中?
	FILE* fp2;
	fp2 = fopen("D:\\leomessi.dat", "r");
	if (fp == NULL)
	{
		printf("文件打开失败");
		exit(0);
	}
	//每一次从fp指向的磁盘文件中读取一个长度为10-1的字符串到str[i]这个数组中去
	//(为什么写成10?因为\0占用一个字符)
	//如果读取成功,那么可以定义出来
	while (fgets(str[i], 10, fp) != NULL)
	{
		printf("%s", str[i]);
		i++;
	}
	fclose(fp);
	return 0;
}

记录一个C程序开发题:

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 50
struct student
{
	char name[30];
	char phone[30];
	float score;
}stu[N];
int main()
{
	int i;
	//输入数据到程序数据区
	void input(struct student stu[N]);
	void sort(struct student stu[N]);//排序
	void search(struct student stu[N], char text[30]);
	//通过fwrite以二进制的形式进行储存input输入的数据到磁盘文件中
	void save(struct student stu[N]);
	//通过fread以二进制形式进行打印输出已经存到磁盘文件中的数据
	void display(struct student stu[N]);
	int menu();
	while (i = menu())//如果输入0,循环之间退出
	{
		switch (i)
		{
		case 1:
			input(stu);
			break;
		case 2:
			display(stu);
			break;
		case 3:
			sort(stu);
			break;
		case 4:
			save(stu);
			break;
		}
		system("pause");
	}
	return 0;
}
	//展示菜单
	int menu()
	{
		int i;
		printf("========================================");
		printf("1.输入志愿者信息\n");
		printf("2.显示志愿者信息\n");
		printf("3.按照专业绩点排序\n");
		printf("4.信息存储到文件\n");
		printf("0.退出\n");
		printf("========================================");
		printf("请输入您的选择:");
		scanf_s("%d", &i);
		getchar();//吸收空格
		return i;
	}
	void input(struct student stu[N])
	{
		int i;
		for (i = 0; i < N; i++)
		{
			printf("请输入姓名");
			gets(stu[i].name);
			printf("请输入电话");
			gets(stu[i].phone);
			printf("请输入分数");
			scanf_s("%f", &stu[i].score);
			getchar();//吸收空格
		}
		//当我们把学生的数据输入到程序数据区之后,
		//我们需要通过fwrite进行输出写入到磁盘文件中去
		//因此调用save方法
		save(stu);
	}
	void save(struct student stu[N])
	{
		//1.先声明一个文件指针
		FILE* fp;
		int i;
		printf("==========================================");
		//2.以wb形式(即是以二进制只写的形式)打开fp指向的文件
		//w代表只写 b代表bit比特为二进制位
		fp = fopen("d:\\student.dat", "wb");
		//我们这里用到转义字符\\表示一个\
		
		if (fp == NULL)
		{
			printf("Cannot open the file!\n");
			exit(0);//表示退出
		}
		for (i = 0; i < N; i++)
		{
			fwrite(&stu[i], sizeof(struct student), 1, fp);
			fclose(fp);
			printf("The file has been saved successfully");
			printf("==========================================");
		}
	}
	//当储存到磁盘文件中之后,我们通过fread进行读取打印
	void display(struct student stu[N])
	{
		int i;
		FILE* fp;
		printf("==========================================");
		//注意这里打开文件的方式应该改正为 rb
		//r代表read b同上解释
		fp = fopen("d:\\student.dat", "rb");
		if (fp == NULL)
		{
			//如果为空,那么证明磁盘文件中没有存储数据
			printf("No data\n");
			return;
		}
		for (i = 0; i < N; i++)
		{
			fread(&stu[i], sizeof(struct student), 1, fp);
			printf("%-20s%-20s%-20.3f\n", stu[i].name, stu[i].phone, stu[i].score);
		}
		printf("==========================================");
		fclose(fp);
	}
	void sort(struct student stu[N])
	{
		int i, j;
		struct student temp;
		for (i = 0; i < N; i++)
		{
			for (j = 0; j < N - 1 - i; j++)
			{
				if (stu[j].score < stu[j + 1].score)
				{
					temp = stu[j];
					stu[j] = stu[j + 1];
					stu[j + 1] = temp;
				}
			}
		}
	}
	void search(struct student stu[N], char text[30])
	{
		int i;
		printf("=======================================");
		for (i = 0; i < N; i++)
		{
			if (strcmp(stu[i].name, text) == 0)
			{
				//如果找到了,那么输出这个学生的信息
				printf("%-20s%-20s%20.3f\n", stu[i].name, stu[i].phone, stu[i].score);
				return;
			}
		}
	}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值