文件操作两例

//相关函数

/* 1.int / float to string / array:

C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。 ● itoa():将整型值转换为字符串。 ● ltoa():将长整型值转换为字符串。 ● ultoa():将无符号长整型值转换为字符串。 ● gcvt():将浮点型数转换为字符串,取四舍五入。 ● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。 ● fcvt():指定位数为转换精度,其余同ecvt()。

除此外,还可以使用sprintf系列函数把数字转换成字符串,其比itoa()系列函数运行速度慢

  1. string / array to int / float C / C++语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。 ● atof():将字符串转换为双精度浮点型值。 ● atoi():将字符串转换为整型值。 ● atol():将字符串转换为长整型值。 ● strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。 ● strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。 ● strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。 */

//题一:从一个文本文件读取一组数字(每行一个数字),然后对其进行从小到大的排序,最后写入到另外一个文件中去 int bubbble_sort(int *array,int len){//传递数组,一般需要加上数组个数这个参数 int p = array; int temp; //int len=sizeof((array)/sizeof(int));//这种方式是得不到数组长度的 for (int i = 0;i < len;i++) { for (int j = 1;j < len - i;j++) { if ((p + j-1) > *(p + j)) { temp = *(p + j); *(p + j) = *(p + j-1); *(p + j-1) = temp; }

	}
}

return 0;

}

int main22() { //检测一下bubble 函数是否可用 //int array[8] = { 1,2,34,546,32,3,456,5 }; //bubbble_sort(array); //for (int x = 0;x < 8;x++) { //printf("array[%d]==%d\n", x, array[x])};

//读文件
FILE *p1 = fopen("C:\\Users\\acer\\Desktop\\test.txt", "r");
int array[100] = { 0 };//文件过大会导致数组过大,最终栈溢出,最好在堆中分配内存
int *p = array;
char buf[20] = { 0 };//用来存放读取的字符串
int len = 0;//用来计数一共读了多少个数字
if (p1 == NULL) {//"=="才是比较等于号,“=”是赋值号,勿弄混
	printf("failure!\n");
}
else {
	memset(buf, 0, sizeof(buf));
	while (!feof(p1)) {
		fgets(buf, sizeof(buf), p1);
		//printf("%s\n", buf);
		array[len] = atoi(buf);
		//printf("array[%d]==%d\n",len,array[len]);
		len++;
	}fclose(p1);
}

//排序
bubbble_sort(array,len);
for (int i = 0;i < len;i++) {
	printf("array[%d]==%d\n", i, array[i]);
}

//写入
FILE *p2 = fopen("C:\\Users\\acer\\Desktop\\test4.txt", "w");
for (int i = 0;i < len;i++) {
	memset(buf, 0, sizeof(buf));
	sprintf(buf, "%d\n", array[i]);//将数组成员转换为字符串
	fputs(buf, p2);
}
fclose(p2);
return 0;

}

//下面演示在堆中建立动态数组的方式:思路,先确定文件共计多少个数字,然后去堆中分配

int main23() {

FILE *p1 = fopen("C:\\Users\\acer\\Desktop\\test.txt", "r");
int len = 0;//计数器
char buf[30] = { 0 };
while (!feof(p1)) {
	memset(buf, 0, sizeof(buf));
	fgets(buf, sizeof(buf), p1);
	len++;
}
//printf("%d\n", len);
int *array = malloc(sizeof(int)*len);
//int *array=calloc(sizeof(int),len);//不需要memset

//后续代码基本相同,记得把计数器重新回到0


memset(array, 0, sizeof(array));
free(array);
fclose(p1);
return 0;

}

//题二:一文本文件,文件中每一行均为一个运算表达式(如:4 + 7 =),读取该文件内容并计算出每个表达式并写入到另外一个文件(如:4 + 7 = 11)

//思路,先解决如何读取一个字符串(“4 + 7 = ”)里面的数字和操作符,然后就按照一般的读、循环、写入便可 //strncpy()函数:复制字符串的前n个字符

int cal_file(char *s) { char buf[50] = { 0 }; char oper = 0; char buf2[50] = { 0 }; int len = strlen(s);

int i=0;
for ( i = 0;i < len;i++)
{
	if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
		memset(buf, 0, sizeof(buf));
		strncpy(buf, s, i);
		//printf("buf==%s\n", buf);
		oper = s[i];
		break;
	}
}
int start = i + 1;
for (;i < len;i++)
{
	if (s[i] == '=')
	{
		strncpy(buf2, &s[start], i - start);
	}
}


switch (oper)
{case '+':
	return atoi(buf) + atoi(buf2);
case '-':
	return atoi(buf) - atoi(buf2);
case '*':
	return atoi(buf) * atoi(buf2);
case '/':
	if (atoi(buf2) != 0) {
		return (atoi(buf) / atoi(buf2));
	}
	else { return 0; }
default:
	break;

}

}

void mod(char *s) {//用来去除字符串结尾的空格 int len = strlen(s); if (s[len-1] == '\n') s[len-1] = 0; return; }

int main() { //char s[] = "7*4="; //printf("%d\n",cal_file(s)); FILE *p=fopen("C:\Users\acer\Desktop\test.txt", "r"); FILE *p1=fopen("C:\Users\acer\Desktop\test5.txt", "w"); char buf[1024] = { 0 }; char buf2[1024] = { 0 }; while (!feof(p)) { memset(buf, 0, sizeof(buf)); fgets(buf, sizeof(buf),p);//读取一行,以'\n'结尾 mod(buf); int value=cal_file(buf); memset(buf2, 0, sizeof(buf2)); sprintf(buf2,"%d\n", value); //printf("%s", buf2); //sprintf(buf2,"%s%d", buf, value); //printf("%s\n", strcat(buf, buf2)); fputs(strcat(buf, buf2), p1);

}
fclose(p);
fclose(p1);
return 0;

}

/* 1.int / float to string / array:

C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明。 ● itoa():将整型值转换为字符串。 ● ltoa():将长整型值转换为字符串。 ● ultoa():将无符号长整型值转换为字符串。 ● gcvt():将浮点型数转换为字符串,取四舍五入。 ● ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。 ● fcvt():指定位数为转换精度,其余同ecvt()。

除此外,还可以使用sprintf系列函数把数字转换成字符串,其比itoa()系列函数运行速度慢

  1. string / array to int / float C / C++语言提供了几个标准库函数,可以将字符串转换为任意类型(整型、长整型、浮点型等)。 ● atof():将字符串转换为双精度浮点型值。 ● atoi():将字符串转换为整型值。 ● atol():将字符串转换为长整型值。 ● strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。 ● strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。 ● strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。 */

转载于:https://my.oschina.net/u/3641281/blog/1539387

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值