每日一题——第三十五题

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

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
	FILE* fp_read;
	FILE* fp_write;
	char str_nums[20];//用来接收读取到的整数

	const char* filePath = "E:\\numbers.txt";
	fp_read = fopen(filePath, "r"); //以读的方式打开文件
	fp_write = fopen(filePath, "w");//以写的方式打开文件

	if (fp_read == NULL) {
		perror("文件打开失败!");
		return EXIT_FAILURE;
	}

	//循环读取直到字符串结束
	while(fp_read !=NULL) {

		if (fgets(str_nums, sizeof(str_nums), fp_read) == NULL) {
			break;
		}
	
	}
	//打印读取到的未排序前的值:
	for (int i = 0; i < 10; i++) {
		printf("%c", str_nums[i]);
	}

	int* intArray = charArrayToIntArray(str_nums, 20);//将char数组转为int型数组

	//对intArray数组元素排序
	bubbleSort(intArray, 20);//对数组元素进行冒泡排序

	//将数组元素写入文件numbers.txt
	 // 将排序后的整数写回到文件  
	for (int i = 0; i < 20; i++) {
		fprintf(fp_write, "%d\n", intArray[i]);
	}
	//打印排序完的数组元素
	if (intArray != NULL) {
		for (int i = 0; i < 20; i++) {
			printf("%d ", intArray[i]);
		}
		printf("\n");
	}

	// 释放分配的内存  
	free(intArray);
	fclose(fp_read);
	fclose(fp_write);

	return 0;
}

/// <summary>
/// charArrayToIntArray
/// </summary>
/// <param name="charArray">字符数组</param>
/// <param name="size">大小</param>
/// <returns></returns>
int* charArrayToIntArray(char* charArray, int* size) {
	// 计算字符数组的长度  
	int length = strlen(charArray);

	// 分配足够的内存来存储int数组  
	int* intArray = (int*)malloc(length * sizeof(int));
	if (intArray == NULL) {
		// 内存分配失败  
		*size = 0;
		return NULL;
	}

	// 遍历字符数组,将每个字符转换为int并存储  
	for (int i = 0; i < length; i++) {
		// 通过charArray[i] - '0'来将字符转换为对应的整数值  
		intArray[i] = charArray[i] - '0';
	}

	// 设置返回的数组大小  
	*size = length;
	return intArray;
}
/// <summary>
/// 冒泡升序排列
/// </summary>
/// <param name="arr">待排序数组</param>
/// <param name="length">长度</param>
void bubbleSort(int* arr, int length) {

	for (int i = 0; i < length - 1; i++) {
		for (j = 0; j < length - (i + 1); j++) {
			if (arr[j] > arr[j + 1]) {
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = arr[j];
			}

		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值