当前位置:C++技术网 > 资讯 > C语言基础教程:15 文件恶搞“黑”

C语言基础教程:15 文件恶搞“黑”

更新时间:2015-10-18 16:28:26浏览次数:1+次

       最近事比较多,没来得及跟新,对不住大家啦!今天,给大家带来一个稍稍有点“黑”的气息的小程序,算作给大家的补偿吧!好啦,废话不多说  直接开干!!!

       通常我们学文件这边的时候,总是噼里啪啦的讲那么多函数啊,读写方式啊,神马文件指针啊,神马打开要关闭啊,哎,好无奈啊!书上都写了,我就不耽误大家了,来点有意思的“小黑”,学编程的嘛,大家都有一颗成为黑客的心,我懂!曾几何时,我也这样痴狂过…..打住,差点梦游了!好了,简单说下今天的程序实现的功能吧!

       首先:消息框大家都看过吧!就是下面这货

 

      哈哈,HelloWorld你们熟悉吧。好啦,我们这次的任务就是把“HelloWorld”给改成“C++技术网”,当然也可以改成你心仪女生的名字呦。

      接着讲一点文件打开的方式的相关内容,为了是让你更爽的自己写出程序来嘛!在上一讲里我们学过常用的打开方式有:r(read) w(write) b(binary) t(text),好了  这就够了其他很多什么追加啊,什么覆盖啊噼里啪啦一大堆,不用管,需要啥就学啥。 打开方式嘛,就是说你想要通过这次打开实现什么功能。是从里面读取数据呢,还是往里边写入数据呢。这是r w的作用。那么b  t又是啥子用呢?这个是windows下的区别,在linux下没这种区别,主要是windows对于换行的处理。不用知道这些琐碎的知识,你只要知道以b读出来的就是最真实的数据。

好啦,上面的讲完了,直接上程序吧。

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

char* memstr(char* full_data, int full_data_len, char* substr);

int main(int argc,char *argv[])
{
	if(argc==2)
	{
        printf("程序使用参数如下:\n");
		printf("demo.exe 恶搞文件路径 被替换文本 替换文本");
		return 0;
	}

	 FILE *fp=fopen(argv[1],"rb+");
	 char buf_dst[512]={0};
	 char *search_for=argv[2];
	 char *buf_src=argv[3];
	 int nCount=0;
	 int i=0,temp=0;
	 char *p=NULL;
	 if(!fp)
	 {
		 MessageBox(NULL,"怎么搞得!都没目标文件","哎",MB_OK|MB_ICONERROR );
		 return 0;
	 }
	  while(fread(buf_dst,1,512,fp)!= 0)
	 {
		if(p = memstr(buf_dst,512,search_for))
		{  
			MessageBox(NULL,"找到了,恶搞成功","哈哈",0);	
			fseek(fp,p-buf_dst-512,SEEK_CUR);
			fwrite(buf_src,strlen(buf_src),1,fp);
			fputc('\0',fp);
			fseek(fp,0,SEEK_END);
			break; 
		}
									   		
	 }
	 fclose(fp);

	 return 0;
}
							   
 

char* memstr(char* full_data, int full_data_len, char* substr)
{
   

    int sublen = strlen(substr);
    int i;
    char* cur = full_data;
    int last_possible = full_data_len - sublen + 1;
	
	if (full_data == NULL || full_data_len <= 0 || substr == NULL) {
        return NULL;
    }

    if (*substr == '\0') {
        return NULL;
    }
    for (i = 0; i < last_possible; i++) {
        if (*cur == *substr) {
            //assert(full_data_len - i >= sublen);
            if (memcmp(cur, substr, sublen) == 0) {
                //found
                return cur;
            }
        }
        cur++;
    }

    return NULL;
}

							   
 

       结合着程序给大家讲解下吧。这个程序要从命令行运行才行。agrc是你从命令行输入的参数的总数,agrv是一个指针数组,每个元素指向你输入的字符串。

然后就调用fopen函数打开被蹂躏的文件,接着获取你想替换掉的字符串,用search_for指针来接受,再然后就是获取你想用什么字符窜去替换(比如你女神的名字)

然后程序就开始查找你所指定的字符串啦,调用memstr这个函数,如果找到了就给

替换掉,找不到就算啦!恩,其实挺简单的,大家看看运行效果!

 

被蹂躏前:

蹂躏过程:

被蹂躏后:

 

好玩吧  自己写一遍程序吧,写完就会拉。有点“黑”哈