📄 加校验.cpp
字号:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<process.h>
#include <stdlib.h>
void simpodd() //奇校验程序
{
char sname[10];//源文件
int a[80];
int i;
printf("please input your source code file name:\n");
scanf("%s",sname);
FILE *fp;
fp=fopen(sname,"r");
if(fp==NULL)
{ printf("file open error\n");
getch();
exit(0);
}//打开源文件
for(i=0 ; !feof(fp)&&i<=80;i++)
{
a[i]=fgetc(fp)-'0';//将源文件内容转化后输入a数组
if( a[i]!=1&&a[i]!=0&&a[i]!=-49)
{
printf("source data error\n");
exit(0);
} //保证为10序列
}
char rname[10];//结果文件
printf("please input your result code file name:\n");
scanf("%s",rname);
int t,j;
for(j=0,t=0 ; j<i-1 ; j++) t=t+a[j];
t=t+1;//求a数组和,加1以实现奇校验
FILE *fp1;
fp1=fopen(rname,"w");
for(j=0 ; j<i-1 ;j++ ) fputc(a[j]+'0',fp1);//输出原码
fputc(t%2+'0',fp1);//输出校验位
fclose(fp);
fclose(fp1);
return;//关文件,返回
}
void verodd() //垂直奇校验程序
{
char sname[10];//源文件
int a[80][10];//二维数组
int i;
printf("please input your source code file name:\n");
scanf("%s",sname);
FILE *fp;
fp=fopen(sname,"r");
if(fp==NULL)
{
printf("file open error\n");
getch();
exit(0);
}//打开文件
for(i=0 ; !feof(fp)&&i<=800;i++)
{
a[i/8][i%8]=fgetc(fp)-'0';//读文件为二维数组付值
if(a[i/8][i%8]!=1&&a[i/8][i%8]!=0&&a[i/8][i%8]!=-49)
{
printf("source data error\n");
exit(0);
} //保证为10序列
}
int k;
i--;
for(k=i%8 ; k<8 ; k++)
{
a[i/8][k]=0;//自动补齐数据每行八个
}
int j,t;
k=i/8;
for(j=0;j<=k;j++)
{
t=0;
for(i=0;i<8;i++) t=t+a[j][i];//求每一行的和
t=t+1;//实现奇校验
a[j][i]=t%2;//加行校验位
a[j][9]='\n'-'0';//实现换行
}
for(j=0;j<=8;j++)
{
t=0;
for(i=0;i<=k;i++) t=t+a[i][j];//求每一列的和
t=t+1;//实现奇校验
a[k+1][j]=t%2;//加列校验位
}
char rname[10];
printf("please input your result code file name:\n");
scanf("%s",rname);//获得结果文件名
FILE *fp1;
fp1=fopen(rname,"w");
for(j=0 ; j<=k+1 ;j++ )
for(i=0;i<=9;i++)
fputc(a[j][i]+'0',fp1);//输出到结果文件
fclose(fp);
fclose(fp1);
return;//关文件,返回
}
void crc()
{
char sname[10],pname[10],rname[10];//源文件、校验码组,结果文件
int a[128],b[40],c[80],r[40];//a源,b检验序列,c模二结果,r模二余
int i,j,t,k;
printf("please input your source code file name:\n");
scanf("%s",sname);
printf("please input your p(x) code file name:\n");
scanf("%s",pname);
printf("please input your result code file name:\n");
scanf("%s",rname);//获取相关文件名
FILE *fp1,*fp,*fp2;
fp=fopen(sname,"r");
if(fp==NULL)
{
printf("file open error\n");
getch();
exit(0);
}//打开文件
fp1=fopen(pname,"r");
if(fp1==NULL)
{
printf("file open error\n");
getch();
exit(0);
}//打开文件
for(i=0 ; !feof(fp)&&i<=128;i++)
{
a[i]=fgetc(fp)-'0';//将源文件内容转化后输入a数组
if( a[i]!=1&&a[i]!=0&&a[i]!=-49)
{
printf("source data error\n");
exit(0);
} //保证为10序列
}
for(j=0 ; !feof(fp1)&&j<=40;j++)
{
b[j]=fgetc(fp1)-'0';//将校验码文件内容转化后输入b数组
if( b[j]!=1&&b[j]!=0&&b[j]!=-49 )
{
printf("source data error\n");
exit(0);
} //保证为10序列
}
i--;
j--;//计数
for(t=i;t<=i+j-1;t++)
a[t]=0;//补零
for(k=0;k<j;k++)
r[k]=a[k];
for(t=0;t<=i;t++)
{
if(r[0]==0)
{
c[t]=0;
if(t!=i)
{
for(k=0;k<j-1;k++)
r[k]=r[k+1];
r[j-1]=a[t+j];
}
}
else
{
c[t]=1;
for(k=0;k<j;k++)
r[k]=(b[k]+r[k])%2;
if(t!=i)
{
for(k=0;k<j-1;k++)
r[k]=r[k+1];
r[j-1]=a[t+j];
}
}
}
for(k=0;k<j;k++)
a[i+k]=r[k];
fp2=fopen(rname,"w");
for(k=0;k<j+i;k++)
fputc(a[k]+'0',fp2);
fclose(fp);
fclose(fp1);
fclose(fp2);
return;//关文件,返回
}
void main()
{
begin: printf("please choose error-correct way:\n");
printf("(1)simple odd:\n");
printf("(2)vericle odd:\n");
printf("(3)crc test:\n");
int n;
scanf("%d",&n);
switch(n)
{
case 1:simpodd();break;
case 2:verodd();break;
case 3:crc();break;
default:printf("wrong number.\n");goto begin;
}
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -