利用C++正则表达式处理,制作“不背单词”的自定义词书(.txt)

 

        前几天突发奇想,想找一些计算机专业的常用英语词汇来背。但是“bu背单词”官方并没有一本计算机专业相关的词书,不过它有自定义词书功能,它能识别的文件是.txt格式的文本文件。.txt文件里面要求是“一行一个单词”。可以去它的官网https://www.bbdc.cn/,登录自己的账号,上传准备好的文本文件,然后它就会自动识别正确的单词,导出你要的词书。


        于是在网上搜索“计算机专业常用英语词汇”。

        有一个非常“整齐”的txt文件,如下: 

 

                

        这样一来就可以利用代码来将不需要的内容删掉,也就是把每一行的单词提取出来。

        


        废话少说,直接上代码: 

/********************************************************
Description:	文件操作:读取指定行,删除指定行,修改指定行
********************************************************/
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
using namespace std;

/************************************
@ Brief:		读取指定行数据
@ Return:
************************************/
void ReadLineData(char* fileName, int lineNum, char* data)
{
	ifstream in;
	in.open(fileName);

	int line = 1;
	while (in.getline(data, 1024))
	{
		if (lineNum == line)
		{
			break;
		}
		line++;
	}

	in.close();
}

/************************************
@ Brief:		字符串转string类型
@ Return:
************************************/
string CharToStr(char* contentChar)
{
	string tempStr;
	for (int i = 0; contentChar[i] != '\0'; i++)
	{
		tempStr += contentChar[i];
	}
	return tempStr;
}

/************************************
@ Brief:		删除指定行
@ Return:
************************************/
void DelLineData(char* fileName, int lineNum)
{
	ifstream in;
	in.open(fileName);

	string strFileData = "";
	int line = 1;
	char lineData[1024] = { 0 };
	while (in.getline(lineData, sizeof(lineData)))
	{
		if (line == lineNum)
		{
			strFileData += "\n";
		}
		else
		{
			strFileData += CharToStr(lineData);
			strFileData += "\n";
		}
		line++;
	}
	in.close();

	//写入文件
	ofstream out;
	out.open(fileName);
	out.flush();
	out << strFileData;
	out.close();
}

/************************************
@ Brief:        修改行数据
@ Return:
************************************/
void ModifyLineData(char* fileName, int lineNum, char* lineData)
{
	ifstream in;
	in.open(fileName);

	string strFileData = "";
	int line = 1;
	char tmpLineData[1024] = { 0 };
	while (in.getline(tmpLineData, sizeof(tmpLineData)))
	{
		if (line == lineNum)
		{
			strFileData += CharToStr(lineData);
			strFileData += "\n";
		}
		else
		{
			strFileData += CharToStr(tmpLineData);
			strFileData += "\n";
		}
		line++;
	}
	in.close();

	//写入文件
	ofstream out;
	out.open(fileName);
	out.flush();
	out << strFileData;
	out.close();
}

int main()
{
	char lineData[1024] = { 0 };
	char str[] = "C:\\Users\\MyWIN10\\Desktop\\words.txt";//文件地址字符串
	int LINENUMBER = 1659;//要处理文件的行数
	for (int i = 1; i <= LINENUMBER; i++) {
		ReadLineData(str, i, lineData);//提取文件的第i行放到linData中

		// 定义正则表达式模式,提取第一个"."到第一个","之间的字符
		regex pattern("\\.(.*?),");

		// 使用std::smatch来存储匹配结果
		smatch match;
		// 使用std::regex_search查找匹配
		if (regex_search(input, match, pattern)) {
			// 检查是否找到匹配项并且匹配结果的大小是否足够大
			if (match.size() > 1) {
				string result = match[1];
				// 将匹配结果复制回lineData
				strncpy_s(lineData, result.c_str(), sizeof(lineData));
				lineData[sizeof(lineData) - 1] = '\0';
				ModifyLineData(str, i, lineData);//将第i行数据修改为linData字符串
			}
		}
		else {
			cout << "第" << i << "行未找到匹配项" << endl;
		}

	}

}

         那几个操作文件的函数是我抄的,哈哈哈。


         运行上面的代码就可以发现原来的words.txt修改成功了。

        拿着这个修改成功的txt文件去“bu背单词”官网上传词书,再等个几分钟,开背! 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值