html2txt h2t.c

该程序将HTML内容转换为纯文本格式,支持处理常见的HTML标签和特殊字符,如版权符号等,并能忽略脚本和样式标签。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*//////////////////////

文件名:	h2t.c v0.2

作者:	苏晓(suxiaojack)

日期:	2008.7

用途:	转换HTML内容为TXT文本

许可 ( License ):	GPL



v0.2

 处理Bug

1、修正无法识别&#数字;问题 UNICODE=>GB2312

2、添加©和 ® 处理

3、修正&处理死循环.



v0.1



//////////////////////*/



#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <windows.h>

#include <locale.h>



UnicodeToGB2312(char* pOut,unsigned short uData)

{

	WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);

	return;

}



#define BUFSIZE 1024*1024*2



char buf[1024*1024*20];

char shadowbuf[1024*1024*20];

char buffer[BUFSIZE];

long size;

int type=0;



#define tocsize 14



//这个东西太多了!常用的可能也就这些吧。

//Windows控制台太变态!注册商标等一些符号无法输出! 

char* toc[tocsize]={"&nbsp;"," ","&lt;","<","&gt;",">","&quot;","/"","&amp;","&","&copy;","◎版权","&reg;","◎注册"};



void usage(char** argv)

{

	char *us="用来转换html =>txt. ver0.2/n"

			"suxiaojack写于2008.7/n";

	char *ue="tstart_in_tag_text:开始的Tag标记中的特征文字,好理解end_in_tag_text了。/n"

	"jump_num:跳过几次开始找到的,默认为0./n"

	"注意不支持正则式!未曾处理水印文字。/n";

	printf("%s",us);

	printf("使用方法:%s <file> [ <start_in_tag_text> [jump_num] <end_in_tag_text> ] /n",argv[0]);

	printf("%s",ue);

};



//strstr快速比较

int ministrstr(char* s,char* f)

{

	char minibuf[16];

	memcpy(minibuf,s,15);

	minibuf[15]=0;

	return strstr(minibuf,f)-minibuf;

};



//strstr转换为小写快速比较。

int ministrstri(char* s,char *f)

{

	char minibuf[16];

	memcpy(minibuf,s,15);

	minibuf[15]=0;

	strlwr(minibuf);

	return strstr(minibuf,f)-minibuf;

}



// 等标记转换

int isintoc(char* streamstart)

{

	int i=0;

	int ret=0;

	while(i<tocsize)

	{

		if(!ministrstr(streamstart,toc[i]))

		{

			printf("%s",toc[i+1]);

			ret=strlen(toc[i]);

			break;

		};

		i+=2;

	};

	if(ret==0) //没有转换处理

	{

		printf("&");

		ret=1;

	};

	return ret;

};





int num2txt(char* numstart)

{

	char tmp[256];

	int pos=0;

	char* s=numstart;

	unsigned short word;

	char os[3];

	while( *s>='0' && *s <='9' )

	{

		tmp[pos++]=*s++;

	};

	tmp[pos]=0;

	word=atoi(tmp);

	memset(os,0,3);

	UnicodeToGB2312(os,word);

	printf("%s",os);

	//s是;跳过

	s++;

	return  s-numstart;

}



//文件全部进入缓存

void read2buf(FILE* fp)

{

	buf[0]=0;

	size=0;

	while(!feof(fp))

	{

		fgets(buffer,sizeof(buffer),fp);

		strcat(buf+size,buffer);

		size+=strlen(buffer);

	};

	buf[size]=0;

	memcpy(shadowbuf,buf,size+1);

	strlwr(shadowbuf);

};



//找标记的开始位置。返回找到后'>'之后的第一个字符位置。

int findstart(char* start,int jump)

{

	char* pos=shadowbuf;

	strlwr(start);

	do

	{

		pos=strstr(pos,start);

		if(pos-shadowbuf < 0 )return -1;

		pos++;

	}while(jump--);

	while(*pos++ != '>')

	{};

	return pos-shadowbuf;

};

//找标记的结束位置。返回找到后'<'之前的最后字符位置。

int findend(char* end,int start)

{

	char* pos=shadowbuf+start;

	strlwr(end);

	pos=strstr(pos,end);

	if(pos-shadowbuf<0)return -1;

	while(*pos-- != '<')

	{

	};

	return pos-shadowbuf;

};



void printline()

{

	switch(type)

	{

		case 1:

		printf("%c",'/r');

		break;

		case 2:

		printf("%s","/r/n");

		break;

		case 3:

		printf("%c",'/n');

		break;

		default:

		break;

	};

};



//转换输出

void h2t(char* s,int len)

{

	char* ss=s;

	while(ss-s<len)

	{

		//判断一下文章换行符号类型

		if(type==0 && ( *ss=='/r'|| *ss=='/n'))

		{

			if(*ss=='/r' &&*(ss+1)=='/n')

			{

				type=2;

			}else if(*ss=='/n')

			{

				type=3;

			}else

			{

				type=1;

			};

		};

		if(*ss!='<')

		{//非标记

			if(*ss=='&')

			{

				if(*(ss+1)=='#')

				{

					ss+=2;

					int may=num2txt(ss);

						ss+=may;

				}else

				{

					int may=isintoc(ss);

					if(may>0)

					{

						ss+=may;

					};

				}

			}

		    else

			{

				printf("%c",*ss);

				ss++;

			};

		}

		else

		{

			//<script标记

			if(!ministrstri(ss,"<script"))

			{

				ss++;

				findnext:

				while(*ss!='<' && ss-s <len)

				{

					ss++;

				};



				if(ss-s>=len)break;



				while(ministrstri(ss,"</script")!=0 && ss-s<len)

				{

					ss++;

					goto findnext;

				};

				if(ss-s>=len)break;

				while(*ss!='>')ss++;

				ss++;

			}else if(!ministrstri(ss,"<style")) //<style标记

			{

				ss++;

				findnext2:

				while(*ss!='<' && ss-s <len)

				{

					ss++;

				};

				if(ss-s>=len)break;

				while(ministrstri(ss,"</style")!=0 && ss-s<len)

				{

					ss++;

					goto findnext2;

				};

				if(ss-s>=len)break;

				while(*ss!='>')ss++;

				ss++;

			}else if(!ministrstri(ss,"</br>"))

			{

				printline();

				ss+=5;

			}else if(!ministrstri(ss,"</p>"))

			{

				printline();

				ss+=4;

			}else if(!ministrstri(ss,"<br>"))

			{

				printline();

				ss+=4;

			}

			else //普通标记

			{

				while(*ss!='>' && ss-s<len)

				{

					ss++;

				};

				if(ss-s>=len)break;

				ss++;

			};

		};

	};

};



int main(int argc,char *argv[])

{

	FILE* fp=0;

	int start,end,jump;

	if(argc==2)

	{

		fp=fopen(argv[1],"r");

		if(!fp)

		{

			usage(argv);

			exit(0);

		};

		read2buf(fp);

		h2t(buf,size);

		fclose(fp);

	}else if(argc==4)

	{

		fp=fopen(argv[1],"r");

		if(!fp)

		{

			usage(argv);

			exit(0);

		};

		read2buf(fp);

		start=findstart(argv[2],0);

	    if(start<0)

		{

			printf("can't find:%s/n",argv[2]);

			exit(1);

		};

		end=findend(argv[3],start);

		if(end<0)

		{

			printf("can't find:%s/n",argv[3]);

			exit(1);

		}

		if(start<end)

		{

			h2t(buf+start,end-start);

		}else

		{

			usage(argv);

		};

		fclose(fp);

	}else if(argc == 5)

	{

		fp=fopen(argv[1],"r");

		if(!fp)

		{

			usage(argv);

			exit(0);

		};

		read2buf(fp);

		jump=atoi(argv[3]);

		start=findstart(argv[2],jump);

		if(start<0)

		{

			printf("can't find:%s/n",argv[2]);

			exit(1);

		};

		end=findend(argv[4],start);

		if(end<0)

		{

			printf("can't find:%s/n",argv[4]);

			exit(1);

		}

		if(start<end)

		{

			h2t(buf+start,end-start);

		}else

		{

			usage(argv);

		};

		fclose(fp);

	}

	else

	{

		usage(argv);

	}



	return 0;

}



/*

与noblank联合使用

h2t filename.htm |noblank >out.txt

*/
1 HTM(HTML)转TXT 所需软件:HTML2TXT.exe 说明:启动软件,单击“添加文件”按钮找到需要转换HTML文件;选择一个输出文件夹,然后单击“开始”按钮即可得到反编译后的HTM文件。 2 CHM转TXT 所需软件:CHM Encoder 说明:启动软件,单击“打开”按钮,找到需要转换的CHM文件;选择一个输出文件夹,然后单击“开始”按钮,即可得到反编译后的HTM文件。接下来执行上面讲过的HTM(HTML)转TXT的步骤,即可得到TXT文件。 3 PDF转TXT 所需软件:PDF Text Converter 说明:启动软件后,先在左上方的浏览器窗口内找到PDF文件所在的文件夹,此时左下方的文件列表窗口中会显示出该文件夹中的PDF文件,选中欲转换的文件,单击工具栏上的“添加文件”按钮,即会在右上方的窗口中列出等待转换的文件,添加完成后,单击齿轮形状的“转换”按钮,即可完成转换转换好的TXT文件保存在源文件所在文件夹内。 4 JAR转TXT 所需软件:WinRAR 说明:只要你的电脑上安装了WinRAR,即可右击JAR文件,直接将其解压缩。此时你需要做的,就是将这些没有扩展名的文件加上TXT的扩展名并合并(快捷的方法下面会有介绍)。 5 UMD转TXT 所需软件:XBookMaker 说明:启动软件后,单击左上方的“Open folder”按钮,定位到包含UMD电子书的文件夹,此时会在左边的的“Files”窗口列出该文件夹内包含的所有UMD格式的电子书,点击一个UMD文件,左下方的“Chapters”窗口中即会显示该电子书中所包含的章节。单击任意一个章节,即可在右边的窗口中看到该章节的内容。现在你只需将其复制并将其粘贴到记事本中,保存为TXT即可, 6 EXE转TXT 所需软件:miniKillEBook 说明:先打开想要转换的EXE电子书,再启动miniKillEBook,勾选“以文本方式保存”复选框,拖动图中的图标到电子书窗口中,单击“开始”按钮,软件即会自动将电子书“逐页翻过”并将每一页的内容存为TXT文本。 刚看到的软件,我比较喜欢用手机看书,这个很方便
<think>我们正在处理一个编译错误:configure error: Can't findfftw3.h。这个错误通常发生在配置或编译过程中,系统无法找到FFTW3库的头文件。FFTW3是一个快速傅里叶变换库,常用于科学计算。下面我们将逐步解决这个问题。 ###步骤1:确认FFTW3是否安装首先,我们需要确认系统中是否已经安装了FFTW3库。在终端中运行以下命令来检查:```bash#检查头文件fftw3.h是否存在find/usr-namefftw3.h2>/dev/null```或者使用包管理工具查询(根据你的Linux发行版): -Ubuntu/Debian:```bashdpkg-l| grepfftw3```- CentOS/RHEL:```bashrpm-qa| grepfftw3``` 如果没有安装,我们需要安装它。 ###步骤2:安装FFTW3库根据你的Linux发行版,使用包管理工具安装:- Ubuntu/Debian:```bashsudoapt-getupdatesudoapt-getinstall libfftw3-dev```- CentOS/RHEL:```bashsudo yum installfftw-devel```###步骤3:设置环境变量(可选) 如果安装后仍然找不到头文件,可能是因为安装路径不在标准搜索路径中。你可以尝试设置环境变量`CPATH`或`C_INCLUDE_PATH`来包含FFTW3头文件的路径。例如,如果头文件位于`/usr/local/include`,则: ```bashexport CPATH=/usr/local/include:$CPATH```然后重新运行配置脚本。###步骤4:在CMake项目中配置FFTW3如果你使用的是CMake,确保在`CMakeLists.txt`中正确查找FFTW3库。参考引用[2]中的方法:```cmakefind_package(FFTW3 REQUIRED)if(NOT FFTW3_FOUND)message(FATAL_ERROR"TheFFTW Librarynot found!") endif()include_directories(${FFTW3_INCLUDE_DIRS})target_link_libraries(your_target_name${FFTW3_LIBRARIES})``` ###步骤5:手动指定头文件路径如果上述方法都不奏效,可以在配置时通过命令行参数指定头文件路径。例如:```bash./configure CFLAGS="-I/path/to/fftw3/include" LDFLAGS="-L/path/to/fftw3/lib"```或者使用`pkg-config`(如果FFTW3提供了.pc文件):```bash./configure CFLAGS="$(pkg-config --cflagsfftw3)" LDFLAGS="$(pkg-config--libs fftw3)"``` ###步骤6:Windows系统下的解决方法对于Windows系统(参考引用[4]): 1.下载预编译的FFTW3库(可从官网http://www.fftw.org/install/windows.html获取)。 2.将下载的DLL文件(如`libfftw3-3.dll`)放入`C:\Windows\System32`。3.将库文件(`.lib`)放入你的编译器的lib目录(例如,对于VisualStudio,可能是`C:\Program Files(x86)\MicrosoftVisual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64`)。 4.将头文件`fftw3.h`放入编译器的include目录(例如,`...\VC\Tools\MSVC\14.29.30133\include`)。###步骤7:检查权限和路径确保头文件所在的目录有读取权限,并且路径正确。如果头文件在非标准路径,确保在编译时正确指定。###总结以上步骤涵盖了解决“Can't findfftw3.h”错误的常见方法。请根据你的具体环境尝试这些步骤。§§相关问题§§1.如何在不同操作系统上安装FFTW3库?2.CMake中如何正确配置外部库(如FFTW3)?3.如何手动编译和安装FFTW3库?4.在Windows系统下使用MinGW编译FFTW3库的步骤是什么?</think>### 解决 "configure error: Can't find fftw3.h" 的方法 这个错误表明编译系统在配置阶段无法找到FFTW3(快速傅里叶变换库)的头文件。以下是系统化的解决方案: #### 1. **确认FFTW3库是否安装** ```bash # 检查头文件是否存在 find /usr -name fftw3.h 2>/dev/null # 检查库文件 ldconfig -p | grep fftw3 ``` 如果无输出,说明未安装FFTW3开发包。 #### 2. **安装FFTW3开发包** **Linux (Debian/Ubuntu):** ```bash sudo apt update sudo apt install libfftw3-dev # 单精度版 sudo apt install libfftw3-double-dev # 双精度版 ``` **Linux (RHEL/CentOS):** ```bash sudo yum install fftw-devel ``` **macOS (Homebrew):** ```bash brew install fftw ``` **Windows:** 1. 从[FFTW官网](http://www.fftw.org/install/windows.html)下载预编译包 2. 将`fftw3.h`放入编译器include路径(如`C:\mingw64\include`) 3. 将`.dll`和`.lib`文件放入对应库路径[^4] #### 3. **配置环境变量** 如果头文件在非标准路径: ```bash # 临时设置 export CPATH=/custom/path/include:$CPATH export LIBRARY_PATH=/custom/path/lib:$LIBRARY_PATH # 永久设置(添加到~/.bashrc) echo 'export CPATH=/custom/path/include:$CPATH' >> ~/.bashrc ``` #### 4. **CMake项目配置** 在`CMakeLists.txt`中添加: ```cmake find_package(FFTW3 REQUIRED) # 查找FFTW3 include_directories(${FFTW3_INCLUDE_DIRS}) # 添加头文件路径 target_link_libraries(your_target ${FFTW3_LIBRARIES}) # 链接库[^2] ``` #### 5. **手动指定路径(编译时)** 在运行`configure`脚本时指定路径: ```bash ./configure CFLAGS="-I/path/to/fftw3/include" LDFLAGS="-L/path/to/fftw3/lib" ``` #### 6. **验证安装** 创建测试程序: ```c #include <fftw3.h> int main() { fftw_complex *in; fftw_plan p; in = fftw_malloc(sizeof(fftw_complex)*1024); p = fftw_plan_dft_1d(1024, in, in, FFTW_FORWARD, FFTW_ESTIMATE); fftw_destroy_plan(p); return 0; } ``` 编译测试: ```bash gcc test.c -o test -lfftw3 -lm ``` #### 7. **常见问题排查** - **权限问题**:确保头文件可读 `sudo chmod -R a+r /usr/local/include` - **多版本冲突**:使用`update-alternatives`管理版本 - **Windows路径问题**:检查环境变量`INCLUDE`和`LIB`的设置[^4] > **关键提示**:FFTW3有单精度(`fftw3f`)、双精度(`fftw3`)和长双精度(`fftw3l`)版本,确保安装的版本与项目要求一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值