个人的第一篇文章(表示还是个刚刚大一狗,记录一些我认为重要的东西吧,有啥错误的地方欢迎指出)。

C
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()函数获取的数据。

在后面fputc()函数,在前一个fprintf向文件中输出了8字符后,再往fp2文件输出回车,表示数据的隔开。形式如下:

20188103
20188125
20188155
20188178

这一步完成后,接下来就是将名字和学号进行匹配,我定义了一个结构体用来存放名字和学号:

struct Student
{
	char name[7];
	int id;
};

声明一个结构体数组,存放需要对比的数据:

struct Student stu2[max];

进行学号和名字的匹配代码:

int k = 0;
while(max--)
{
    fscanf(fp_name, "%s\n", name2);  //从名字文本读取名字
    strcpy(stu1804[k].name, name2);  //将读取出的名字存放至结构体中
	fscanf(fp_id, "%d\n", &id2);            //读取学号
	stu1804[k++].id = id2;                    //存放
}

名字文件中名字的格式如下:

张三
李四
王二
二狗子

以上需要处理的数据处理完毕后,再同理录入原始数据(正确的数据)至另一个结构体数组中:

struct Student stu1[max];

接下来进行匹配:

    int i, k, l = 0;
	for(i = 0; i < max; i++)
	{
		for(k = 0; k < max; k++)
		{
			if(strcmp(stu1[i].name, stu2[k].name) == 0)  //先比对名字
			{
				if(stu1[i].id == stu2[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);

常用来对比字符串用的函数,需要头文件

#include <string.h>

程序运行结果如下:
有错误就是:
文本数据的整理与对比-LMLPHP
无错误就是:
文本数据的整理与对比-LMLPHP
写这篇代码的原因是我辅导员让我帮个忙,对比下班上的名字和学号是否正确,正确的数据在excel文件中,需要对比的数据是一张图片。我就想通过代码来实现对比,恰好qq里面又有图像文字转换功能,于是就写出个这样的代码。
在写代码的过程中,意识到自己对于指针这个概念理解不是很深。
本来一开始我想直接在如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函数对指针所指的内存进行操作,也就是将数据直接写入指针指的内存,所以会抹去原来的数据。这样理解就没错了。

10-06 11:28