整型数组处理算法(二)文件中有一组整数,要求排序后输出到另一个文件中

如题,需要将文件里的一组整数,排序后写到另外一个文件中。

思路:

一次读取一个sizeof(int),然后往一个int*数组里写入,写入的时候就比较,进行排序。

然后,在遍历数组,写到文件中。


实现代码如下:

#define READ_FILE  "C:\\tempR.txt"
#define WRITE_FILE  "C:\\tempW.txt"


/*按降序排列数组*/
int InsertData(int* a, int nValue, int nCount)
{
	for (int i=0; i<nCount; i++)
	{
		if (a[i]<nValue)
		{
			for (int j=nCount-1; j>i; j--)
			{
				a[j]=a[j-1];
			}

			a[i]=nValue;

			break;//跳出循环
		}
	}
	return 0;
}

/*写数据到文件*/
int WriteData(int* a,  char* pFile,int nCount)
{
	FILE* fpWrite=NULL;
	fpWrite = fopen(pFile, "wb+");
	if (fpWrite!=NULL)
	{
		for (int i=0; i<nCount; i++)
			fwrite((char*)&a[i], sizeof(int), 1, fpWrite);

		fclose(fpWrite);
	}

	return 0;
}

int ProcessData()
{
	FILE* fpRead =NULL;
	int nSize=0;
	int nTemp;
	int nCount=0;
	
	int* a50;//int* a50 = new int[];,这样写会导致R6030 CRT not initialized,错误提示。
		     //这里应该是内存没有申请就使用了。

	fpRead = fopen(READ_FILE, "rb+");

	if (fpRead!=NULL)
	{
		fseek( fpRead, 0L, SEEK_END );
		int nRet = ftell(fpRead); 

		a50 = new int[nRet/sizeof(int)];

		fseek( fpRead, 0L, SEEK_SET );//移到文件头

		nSize = fread((void*)&nTemp, sizeof(int), 1, fpRead);
		while (nSize>0)
		{
			nCount++;

			InsertData(a50, nTemp, nCount);

			
			nSize = fread((void*)&nTemp, sizeof(int), 1, fpRead);
		}

		fclose(fpRead);
	}
	
	WriteData(a50, WRITE_FILE, nCount);

	delete a50;
	a50 = NULL;

	return 0;
}



int main()
{
/*
//可以执行这个先进行写测试数据到文件
	int* a=new int[10];
	for (int i=0; i<10; i++)
	{
		*(a+i)=i;
	}

	WriteData(a, READ_FILE, 10);

	delete a;
	a = NULL;
*/
	ProcessData();
	return 0;
}

测试结果,就不贴了,有兴趣的朋友可以用代码测试测试,文件是按二进制写的,用UE或其他可以查看二进制的工具打开。


在这个过程遇到R6030 CRT not initialized的问题,才改变算法,先读取文件大小,计算整型数个数。关于为什么会出现R6030 CRT not initialized另外写一篇。


转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12040301





  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来帮助你解决这个问题。选择排序法是一种简单的排序算法,它的基本思想是每次从待排序数组中选出最小的元素,将其放到已排好序的元素的末尾。因此,在排序完成之后,整个数组就是按从小到大的顺序排列的。 下面是用选择法对一维数组中的 n 个整数按从小到大进行排序的C语言实现代码: ``` #include <stdio.h> void selection_sort(int arr[], int n) { int i, j, min_idx; for (i = 0; i < n-1; i++) { // 找到从 i 开始到 n-1 之间最小的元素的下标 min_idx = i; for (j = i+1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; // 将找到的最小元素放到已排好序的序列末尾 int temp = arr[min_idx]; arr[min_idx] = arr[i]; arr[i] = temp; } } int main() { int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr)/sizeof(arr[0]); selection_sort(arr, n); printf("Sorted array: \n"); for (int i=0; i < n; i++) printf("%d ", arr[i]); return 0; } ``` 在这个代码,我们定义了一个名为 selection_sort 的函数来进行排序。这个函数的参数包括一个整型数组 arr 和数组的长度 n。函数嵌套了两个 for 循环,用来找到每个需要排序的元素的最小值,并且将其交换到已排好序的元素的末尾。 在主函数,我们定义了一个需要排序数组 arr,并且计算了它的长度 n。然后我们调用了 selection_sort 函数,将数组 arr 作为参数传入。排序完成后,使用 for 循环遍历输出排好序的数组即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值