个人的第一篇文章(表示还是个刚刚大一狗,记录一些我认为重要的东西吧,有啥错误的地方欢迎指出)。
写这篇代码的原因是我辅导员让我帮个忙,对比下班上的名字和学号是否正确,正确的数据在excel文件中,需要对比的数据是一张图片。我就想通过代码来实现对比,恰好qq里面又有图像文字转换功能,于是就写出个这样的代码。
在写代码的过程中,意识到自己对于指针这个概念理解不是很深。
首先是处理转换出的学号数据,转换出来的结果是这样的:
于是用代码来进行转换处理:
while( (a = fgetc(fp1)) != EOF)
{
if(a >= '0' && a <= '9') // 需要0-9的数字
{
i++;
fprintf(fp2, "%c", a);
if(i % 8 == 0) //检测到了八个数字
fputc('\n', fp2); //回车一下
}
}
fp1 文件是要处理的学号数据文件,内容是通过qq的图片文字转换得到的,所以存在一些不需要的杂乱数据如下划线(_),空格这样的。
fp2文件是保存通过fprintf()函数获取的数据。
注:
int fprintf( FILE *stream, const char *format [argument ]...);
FILE *stream : 文件指针
const char *format : 格式
[argument] : 参数
该函数是向输出流中写入指定格式的数据。感觉就是在prinf()函数基础上加了一个文件指针。
在后面fputc()函数,在前一个fprintf向文件中输出了8字符后,再往fp2文件输出回车,表示数据的隔开。形式如下:
20181778
20181791
20181784
20181769
20181763
这一步完成后,接下来就是将名字和学号进行匹配,我定义了一个结构体用来存放名字和学号:
struct Student
{
char name[7];
int id;
};
声明一个结构体数组,存放需要对比的数据:
struct Student stu2[max];
进行学号和名字的匹配代码:
int k = 0;
while(max--)
{
fscanf(fp_name, "%s\n", name2); //从名字文本读取名字
strcpy(stu1[k].name, name2); //将读取出的名字存放至结构体中
fscanf(fp_id, "%d\n", &id2); //读取学号
stu1[k++].id = id2; //存放
}
名字文件中名字的格式如下:
张三
李四
王二
二狗子
以上需要处理的数据处理完毕后,再同理录入原始数据(正确的数据)至另一个结构体数组中:
struct Student stu1[max];
接下来进行匹配:
int i, k, l = 0;
for(i = 0; i < 4; i++)
{
for(k = 0; k < 4; k++)
{
if(strcmp(stu1[i].name, stu2[k].name) == 0) //先比对名字
{
if((stu1[i].id == str2[k].id) //若学号一样
continue;
else
{
printf("发现第 %d 个错误: \n", ++l);
printf("原始信息: %s - %d \n",stu1[i].name, stu1[i].id);
printf("错误信息: %s - %d \n",stu2[k].name, stu2[k].id);
puts("");
}
}
}
}
if(l == 0)
printf("\n\n\n无错误!\n\n\n");
拓展:
extern int strcmp(const char *s1,const char *s2);
对比s1,和s2,若相等则返回0;
若s1大于s2,则返回正数;
若s1小于s2,则返回负数;
常用来对比字符串用的函数,需要头文件
#include <string.h>
程序运行结果如下:
有错误就是:
无错误就是:
本来一开始我想直接在如1234567812345678这样的文本中,直接隔8个数据输出一次回车,用 fputc函数,结果发现无法实现。我用的代码是这样的:
while( ( c = fgetc(fp)) != EOF)
{
i++;
if(i % 8 == 0)
fputc('\n', pf);
}
无法成功的原因是没理解对这几个函数理解不够好。
如fgetc是读取一个字符后自动向后移动一个光标。
我认为用fputc函数就可以在需要的位置输出一个回车,但是fputc是需要文件指针所在的位置,也就是说,这段代码就一直在文件指针开始的位置输出回车,没有达到隔8个输出一次回车的目的。
后来我用了
int fseek(FILE *stream, long offset, int fromwhere);
函数来移动文件指针输出回车。
fseek(fp, 8, 0);
发现输出后的虽然有回车,但是数据有损失,回车覆盖了两个字符。
在这里我又意识到我将“光标位置”和“指针位置”给乱套了。
光标位置就是打字的时候一闪一闪的那个东西,
指针位置就是当前指针所指的内存。
fputc函数对指针所指的内存进行操作,也就是将数据直接写入指针指的内存,所以会抹去原来的数据。这样理解就没错了。