【C】文件操作练习

练习题目是某高校的考研专业课题目,题解都是自己写的,如果有错误,或者更优解,将会十分感谢能够指出

1.某文本文件records.txt存放了某公司30位员工的打卡次数,格式如下

工号    姓名   次数
S1001   张三    25
S1002   李四    20
......

编写程序,输出打卡次数最多的员工的工号、姓名和打卡次数。注意:打卡次数最多的员工可能不唯一,这时候要把他们都输出

#include "stdio.h"
#include "string.h"

typedef struct
{
	char id[10];        //工号
	char name[10];      //姓名
	int count;          //打卡次数
}recordInfo_TypeDef;

recordInfo_TypeDef buf[30];

int main(int argc, char *argv[])
{
	char temp_count[3];        //暂存储打卡次数
	char temp[30] = {0};       //存储打卡次数最多的在数组中的序号
	int i = 0,k =0;
	FILE *fp = fopen("F:\\records.txt", "r");
	if (fp == NULL)
	{
		perror("Open Fail");
	}
	else
	{
		while (!feof(fp))
		{
			buf[i].count = 0;            //初始化打卡次数为0
			fscanf(fp, "%s%s%s", buf[i].id, buf[i].name, temp_count);      //从文件中读取,按照工号,姓名,打卡次数的格式
			for (int j = 0; temp_count[j] != '\0'; j++)     //文件中储存的是字符串形式,此for循环的作用为将打卡次数字符串形式转变为数字
				buf[i].count = buf[i].count * 10 + (temp_count[j] - '0');

			if (i > 0)
			{
				if (buf[i].count < buf[temp[0]].count)
					continue;
				else if (buf[i].count == buf[temp[0]].count)
					temp[++k] = i;
				else if (buf[i].count > buf[temp[0]].count)
				{
					memset(temp, 0, sizeof(temp));
					temp[0] = i;
				}
			}
			i++;
		}
		fclose(fp);

		for (i = 0; temp[i] != 0; i++)
		{
			printf("%s  %s  %d\n", buf[temp[i]].id,buf[temp[i]].name,buf[temp[i]].count);
		}
	}
	return 0;
}

2.有一个文本文件numbers.txt,其中有20个整数,每个整数占一行。编写程序将这些整数按照从小到大的顺序排好后,重新写入到该文件中。要求在排序前后分别输出该文件内容

#include "stdio.h"
#include "string.h"

int main(int argc, char * argv[])
{
	int temp = 0;
	char nums[20] = { 0 };
	int numbers[20] = {0};          //将文件中的整数暂存在数组
	int len = 0;                    //用来表示有多少行

	memset(numbers, 0, sizeof(numbers));
	FILE *fp = fopen("F:\\records.txt", "r");
	if (fp == NULL)
	{
		perror("Open Error");
	}
	else
	{
		printf("排序前的整数顺序为:");
		while (!feof(fp))
		{
			fscanf(fp, "%s", nums);
			if (nums[0] == '-')		            //表示负数
			{
				for (int j = 1; nums[j] != '\0'; j++)
					numbers[len] = numbers[len] * 10 + (nums[j]-48);
				numbers[len] = -1 * numbers[len];
			}
			else
			{
				for (int j = 0; nums[j] != '\0'; j++)
					numbers[len] = numbers[len] * 10 + (nums[j]-48);
			}
			printf("%d, \n",numbers[len]);
			len++;
		}
		fclose(fp);
	}

    /*冒泡排序*/
	for (int j = 0; j < len - 1; j++)
	{
		for (int k = 0; k < (len - 1); k++)
		{
			if (numbers[k] > numbers[k + 1])
			{
				temp = numbers[k];
				numbers[k] = numbers[k + 1];
				numbers[k + 1] = temp;
			}
		}
	}

	fp = fopen("F:\\records.txt", "w");

	printf("\n排序后的整数顺序为:");
	for (int j = 0; j < len; j++)
	{
		printf("%d, ", numbers[j]);

		fprintf(fp, "%d\n", numbers[j]);
	}

	fclose(fp);
	return 0;
}

3.某商店用二进制文件来存储商品信息,包括商品编号(长度为10的字符串)、商品名称(长度为20的字符串)、单价和数量。编写程序完成以下功能

1.输入商品信息,将它们存到二进制文件中取,每次输完一个商品信息后,按N结束输入,其他字符继续输入

2.输入一个商品编号查找这个商品信息

#include "string.h"
#include "stdlib.h"
#include "stdio.h"

typedef struct
{
	char id[10];
	char name[20];
	char price[10];
	char amount[10];
}GoodsInfo_TypeDef;

void InputGoods_Info(FILE *file)
{
	float temp_price = 0;
	int temp_amount = 0;
	int i = 1;
	char temp = 0;
	file = fopen("F:\\GoodsInfo.bin", "ab");
	while (1)
	{
		GoodsInfo_TypeDef goods;
		printf("请输入第%d商品编号: ",i);
		scanf("%s", goods.id);
		goods.id[10] = '\0';
		fflush(stdin);

		printf("请输入第%d商品名称: ",i);
		scanf("%s", goods.name);
		goods.name[20] = '\0';
		fflush(stdin);

		printf("请输入第%d商品价格: ",i);
		scanf("%f", &temp_price);
		fflush(stdin);

		printf("请输入第%d商品数量: ",i);
		scanf("%d", &temp_amount);
		fflush(stdin);

		fprintf(file, "%s %s %.2f %d\n", goods.id, goods.name, temp_price, temp_amount);
		printf("第%d个商品信息输入完毕,按N键结束输入,按任意键继续录入商品信息: ",i);
		scanf("%c", &temp);
		if (temp == 'N' || temp == 'n')
		{
			printf("输入完毕已退出\n");
			break;
		}
		else i++;
	}
	fclose(file);

	return;
}

void FindGoods_Info(char *buf,FILE *file)
{
	file = fopen("F:\\GoodsInfo.bin", "r");
	int a = 0;
	while (!feof(file))
	{
		GoodsInfo_TypeDef goods;
		fscanf(file, "%s%s%s%s", goods.id, goods.name, goods.price, goods.amount);
		if (!strncmp(buf, goods.id, strlen(goods.id) + 1))
		{
			printf("查找的商品编号为%s\n", goods.id);
			printf("查找的商品名称为%s\n", goods.name);
			printf("查找的商品价格为%s\n", goods.price);
			printf("查找的商品数量为%s\n", goods.amount);
		}
	}
	fclose(file);
}

int main(int argc, char * argv[])
{
	FILE *fp = NULL;

	InputGoods_Info(fp);
	FindGoods_Info("S523", fp);

	return 0;
}

### 回答1: 学习 C 语言文件操作的最佳方式是首先通过学习书籍和在线教程来获取基本知识,然后练习一些基本的示例程序,以加深理解。另外,你还可以尝试自己编写一些程序,并尝试使用 C 语言的文件操作功能来完成不同的任务。 ### 回答2: 要练习C语言文件操作,可以按照以下步骤进行: 1. 理解文件操作的基本概念:了解C语言文件操作函数和相关的数据类型,例如文件指针、文件打开模式等。 2. 编写简单的文件读写程序:从文件读取数据并打印出来,或者将一些数据写入到文件。这样的练习可以帮助你熟悉文件读写的操作流程和相关函数的使用。 3. 打开、创建和关闭文件练习使用fopen()函数打开或创建文件,并使用fclose()函数关闭文件。可以尝试使用不同的文件打开模式,例如读取模式("r")和写入模式("w")。 4. 读取和写入不同类型的数据:尝试使用不同的文件操作函数,如fscanf()和fprintf(),来读取和写入不同类型的数据,如整数、浮点数和字符串。 5. 文件定位和指针操作:了解和练习使用fseek()函数和ftell()函数进行文件定位操作,以及使用fgetc()和fputc()等函数进行文件指针的移动和操作。 6. 错误处理和异常情况处理:尝试使用feof()和ferror()等函数检测文件结尾和错误状态,并处理可能的异常情况,以保证程序的稳定性与安全性。 7. 练习使用文件系统相关的函数和库:例如使用<dirent.h>库的函数来遍历目录,或者使用其他文件操作相关的函数,如rename()和remove()等。 在练习过程,可以配合查阅C语言文件操作函数的相关文档和教程,加深对文件操作的理解和熟练度。同时,多进行实践和实际应用,将文件操作与其他C语言知识结合起来,例如结构体、指针等,提高实际编程能力和解决问题的能力。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值