C语言程序出错处理
命令行参数实现C语言程序出错处理
(1)执行d:>p.exe myinput.txt myoutput.txt 时,如果指定的文件名myinput.txt 不存在,那么程序应提示出错;如果指定的文件名myinput.txt 中的数据格式不正确,某一行出现字母或者汉字等等不是整数的情况,应提示输入文件格式不符合要求。
程序出出错问题。需要解决的问题有:判断输入参数是否正确,不正确则报错;判断文件是否存在,不存在则报错;判断某一行是否出现字母或者汉字等不是整数的情况,出现则报错,并且识别到行;文件是否成功关闭,未关闭则报错。
#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
判断命令行参数输入错误代码如图:
命令行参数输入错误结果:
指定文件不存在时的报错代码:
指定文件不存在时的报错结果:
文本文件中出现字母或者汉字等等不是整数的情况时,会不满足计算的要求,我们要输出文件格式不符合要求的出错处理。可以采用C 语言的isdigit() 函数来判断一个字符否为数字。语法:int isdigit(int c); 参数c 表示要检测的字符。返回值:返回值为非0(真)表示c 是数字,返回值为0(假)表示c 不是数字。isdigit() 可以用来检测一个字符是否是十进制数字,即0-9 这
10 个整数,我们新建一个数组来按照字符接收myinput.txt 中的数据并进行判断,如果为数字则继续进行下一步,反之则提示错误,跳出循环。
判断文本文件中有汉字或着字母报错代码如图:
文本文件中有汉字或着字母报错结果:
判断文件关闭提示如图:
文本文件关闭报错结果:
文件中会包含字母,字符读取流赋值给了整型变量,当文件中的所有数据以整型处理后需要输出字符型字母时无法输出夹杂的字母。
注意输入输出数据测试时自己创建来测试如图: