文本文件、二进制文件操作02(C)

现有一个二进制文件 E82_data.bin,其中存储了若干整数, 请将文件保存至 C 盘根目录下的 cdata 文件夹。 编写程序完
成如下功能:
(1) 编写一个函数, 读取出这些整数。
(2) 编写一个函数,对所有整数按照从小到大排序。
(3) 编写一个函数,将所有整数输出到 C 盘根目录下的 cdata 文件夹中的文本文件中 E82_result.txt,要求所有整数输出在同一行,每个整数占 8 列。
(4) 编写一个函数,从第一个整数开始计数,当计数到 k 时,删除第 k 个整数,然后从第 k+1 个整数开始从新计数,当再次计数到 k 时,删除第 k 个整数,当计数到最后一个整数时,再次回到第一个整数开始计数,依次类推,直到只有一个整数为止。在测试程序中输出该整数。 k 由参数传入。
(5) 编写测试程序
 

/*============================================================================
*学号:1527403059
*作业:E82
*功能:(1) 编写一个函数,读取出这些整数。 
       (2) 编写一个函数,对所有整数按照从小到大排序。 
       (3) 编写一个函数,将所有整数输出到 C 盘根目录下的 cdata 文件夹中的文
           本文件中 E82_result.txt,要求所有整数输出在同一行,每个整数占 8 列。 
       (4) 编写一个函数,从第一个整数开始计数,当计数到 k 时,删除第 k 个整
           数,然后从第 k+1 个整数开始从新计数,当再次计数到 k 时,删除第 k 个整
           数,当计数到最后一个整数时,再次回到第一个整数开始计数,依次类推,
           直到只有一个整数为止。在测试程序中输出该整数。k 由参数传入。 
       (5) 编写测试程序。 
*作者:陆胤任
*日期:2016.1.3
*=============================================================================*/
#include<stdio.h>
#include<stdlib.h>

struct Number                                                      //结构体
{
	int num;
};

struct NumberNode                                                   //链表
{
	int num;
	struct NumberNode *next;
};

/*function define
*@brief:读取出这些整数
*@param:char *Filename:文件名
*@reval:*head:链表头节点
*/
struct NumberNode *ReadNumberNodeFormList(char *Filename)
{
	struct NumberNode *head,*p,*q;
	int res,t,i=0;
	FILE *fp;
	fp=fopen(Filename,"rb");
	if(NULL==fp)                                                                //检查是否文件打开失败
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	head=(struct NumberNode*)malloc(sizeof(struct NumberNode));                 //开辟新空间
	q=head;
	while(!feof(fp))                                                            //如果未遇到文件结束标志
	{
		res=fread(&t,sizeof(int),1,fp);
		if(res==0)
		{
			continue;
		}
		p=(struct NumberNode*)malloc(sizeof(struct NumberNode));
		p->num=t;
		q->next=p;
		q=p;
	}
	p->next=NULL;
	fclose(fp);                                                                  //关闭文件
	return head;
}

/*function define
*@brief:对所有整数按照从小到大排序。
*@param:struct NumberNode *head:头节点
*@reval:void
*/
void Sort_NumberNode(struct NumberNode *head)
{
	struct NumberNode *pi,*pj,*pmin;
	struct Number temp;
	pi=head->next;
	while(pi->next!=NULL)                                                          //选择排序
	{
		pmin=pi;
		pj=pi->next;
		while(pj!=NULL)
		{
			if(pmin->num>pj->num)
			{
				pmin=pj;
			}
			pj=pj->next;
		}
		if(pmin!=pi)
		{
			temp.num=pmin->num;
			pmin->num=pi->num;
			pi->num=temp.num;
		}
		pi=pi->next;
	}
}

/*function define
*@brief:将文件内容显示到屏幕上
*@param:struct NumberNode *head:头节点
*@reval:void
*/
void Display_NumberNode(struct NumberNode *head)
{
	struct NumberNode *p;
	int c=0;
	p=head->next;
	while(p!=NULL)
	{
		printf("%8d",p->num);
		c++;
		if(c%3==0)                                                    //每3个数换一行
		{
			printf("\n");
		}
		p=p->next;
	}
	printf("\n");
}

/*function define
*@brief:将所有整数输出到 C 盘根目录下的 cdata 文件夹中的文本文件中 E82_result.txt,要求所有整数输出在同一行,每个整数占 8 列
*@param:char *Filename:文件名
        struct NumberNode *head:链表头节点
*@reval:void
*/
void Write_NumberNode(char *Filename,struct NumberNode *head)
{
	struct NumberNode *p;
	FILE *fp;
	fp=fopen(Filename,"w");
	if(NULL==fp)                                                             //检查是否打开文件失败
	{
		printf("打开文件失败!\n");
	}
	p=head->next;
	while(p!=NULL)
	{
		fprintf(fp,"%8d",p->num);                                            //将文杰内容写入文本文档
		p=p->next;
	}
	fprintf(fp,"\n");
	fclose(fp);                                                              //关闭文件
}

/*function define
*@brief:删除节点
*@param:struct NumberNode *head:链表头节点
        int k:有参数传入,计数
*@reval:int t:删除后所剩的整数
*/
int Delete_NumberNode(struct NumberNode *head,int k)
{
	struct NumberNode *p,*q;
	int i,t,count=1;
	q=head;
	p=q->next;
	do
	{
		if(p==NULL)
		{
			q=head;
			p=q->next;
			continue;                                                 //跳出当前循环
		}
		if(count%k==0&&count!=0)
		{
			count=1;
			q->next=p->next;
			free(p);
			p=q->next;
		}
		else
		{
			count++;
			q=p;
			p=p->next;
		}
	}while(!(q==head&&p->next==NULL));
	t=p->num;
	return t;
}

/*function define
*@brief:释放链表
*@param:struct NumberNode *head:链表头节点
*@reval:void
*/
void Free_NumberNode(struct NumberNode *head)
{
	struct NumberNode *p,*q;
	p=head;
	while(p!=NULL)                                                              //循环释放
	{
		q=p;
		p=p->next;
		free(q);
	}
}

int main()                                                                          //主函数
{
	struct NumberNode *head;
	int k,t;
	head=ReadNumberNodeFormList("C:\\cdata\\E82_data.bin");
	Sort_NumberNode(head);
	printf("排序后的整数如下:\n");
	Display_NumberNode(head);
	Write_NumberNode("C:\\cdata\\E82_result.txt",head);
	printf("请输入一个数,确保该整数不大于程序显示的整数的个数:\n");
	scanf("%d",&k);
	t=Delete_NumberNode(head,k);
	printf("最后得到的数为:\n");
	printf("%d\n",t);
	Free_NumberNode(head);                                                               //释放链表
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ukco_well/article/details/82218906