标题C语言程序性能优化
(1)进一步提升程序的计算能力。使之能计算任意实数的任意次方的输出结果,我们
将计算的次方数也放在命令行参数中,作为第3 个命令行参数,例如:d:>p.exe inputdata.txt myoutput2.txt 5, 那么就意味着计算inputdata.txt 中的所有数据的5 次方,并将结果输出到myoutput2.txt 文件中。
提升程序的计算能力,使之能计算任意实数的任意次方只需在程序中再加入一个输
入次幂的命令行参数即可,即加入下面代码中的第70 行,argv[3] 是字符串格式,sscanf 与scanf类似,都是用于输入的,只是后者以屏幕(stdin) 为输入源,前者以固定字符串为输入源。从一个字符串中读进与指定格式相符的数据,相应的对72 行以及第9 行做出调整即可。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc,char*argv[])
{
FILE*fp1,*fp2;//文件指针表示的两个流
if (argc!=4)
{
printf("参数输入不正确!");
printf("提示:命令 输入文件 输出文件 幂次");
}
if(fp1==NULL)
{
printf("输入文件打开失败");
return 0;
}
fp1=fopen(argv[1],"r");//打开并读取参数argv[1]对应的输入文件
int a,c, i=0,j=0;
int lines = 0; //行数
int temp;//用于求幂
float x,y;//x为输入的数字,y为输出的数字
//fp2=fopen(argv[2],"w");//打开并写入参数argv[2]对应的输出文件,与“w”相比“a”也可以写入文件,但是写之前文件不进行格式化
//检测行数//////////////////////////////////////////
while((c = fgetc(fp1))!= EOF)
{
if(c=='\n')
lines++;
}
lines = lines+1;
fclose(fp1);
int data[ lines ]; //存放运算结果
char sdigit [ lines*2]; //检测格式数组
//判断文件格式/////////////////////////////////////
fp1=fopen(argv[1],"r");//打开并读取参数argv[1]对应的输入文件
while(!feof(fp1))//feof本身是一个非负的整型常量,表明以达到文件末尾
{
fscanf(fp1,"%s",sdigit);
for(j=0;sdigit[j];++j)
{
if(isdigit(sdigit[j]))
{
//x=sdigit[j];
//y=pow(x,3);
//fprintf(fp2,"%f\n",y);//格式化的文件输出,读入并且赋值给实际参数,从第一个参数fp2指定的流中输出内容
}//返1
else
{
printf("文件中有字母或汉字");
//fprintf(fp2,"%c\n",sdigit[j]);//格式化的文件输出,读入并且赋值给实际参数,从第一个参数fp2指定的流中输出内容
exit(0);
}
}
}
fclose(fp1);
//写入文件/////////////////////////////////////////////
//float x,y;//x为输入的数字,y为输出的数字
fp1=fopen(argv[1],"r");//打开并读取参数argv[1]对应的输入文件
fp2=fopen(argv[2],"w");//打开并写入参数argv[2]对应的输出文件,与“w”相比“a”也可以写入文件,但是写之前文件不进行格式化
while(!feof(fp1))//feof本身是一个非负的整型常量,表明以达到文件末尾
{
fscanf(fp1,"%f\n",&x);//格式化的文件输入,读入并且赋值给实际参数,从第一个参数fp1指定的流中读入内容
//scanf("%d",&x);//总是从标准输入流stdin中读入内容
//y=x*x*x;//计算x的三次方
sscanf(argv[3],"%d",&temp); //argv[3]是字符串格式,sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。从一个字符串中读进与指定格式相符的数据
printf("temp:%d",temp);
data[i]=pow(x,temp);
printf("data[%d]:%d",i,data[i]);
//fprintf(fp2,"%f\n",y);//格式化的文件输出,读入并且赋值给实际参数,从第一个参数fp2指定的流中输出内容
//prinf("%d",&y);//总是从标准输入流stdin中输出内容
fprintf(fp2,"%d\n",data[i]);//格式化的文件输出,读入并且赋值给实际参数,从第一个参数fp2指定的流中输出内容
i++;
}
fclose(fp1);
fclose(fp2);
return 0;
if (fclose(fp1)!=0);//关闭文件成功关闭则返回值为0
{
printf("文件 %s\n 关闭错误",argv[1]);
}
if (fclose(fp2)!=0);
{
printf("文件 %s\n 关闭错误",argv[2]);
}
}
/////////////////////
//验证
//gcc p.c -o p.exe
//p.exe myinput.txt myoutput2.txt 5
计算输入文件数据的5 次幂: