一段完整的检测输入文档中是否包含特殊字符的代码

发布于 2024-01-08  538 次阅读


晚上上床后突然接到了主人要我帮忙用yakuyaku翻译工具批量翻译文本的任务,于是二话不说跳下床用指定的软件开始了流水线式的处理。
本来以为可以上床美美睡一觉,但是问题出现了!
翻译的进度突然卡在了一个txt上,出于好奇和一些焦急,我找到并打开了这个难倒了ai翻译软件的txt一探究竟
↓↓↓

...好家伙,起头全是 ▽ 这种特殊符号。
那AI被难倒,倒也不是什么奇怪事了(笑)。
这些文本最终是需要合并的,如果缺少了一些文本,估计会出现比较严重的问题,既然要帮忙,就肯定要帮到底嘛。注意到这些文档都是用有序数字命名,且数据量只有1e5,用程序处理是更高效的,于是就边查边学写了一段c++程序,最终将含有特殊字符的txt文档名字总计105个,全部输出到了out.txt中,完美完成了任务↓↓↓。

在学习的过程中,也发现了很多问题:

  1. freopen函数第一个参数文件名,需要一个以\0为结尾的字符数组,否则在调用的时候不能正确显示其中的内容。
  2. 用UFT-8保存的中文会占2-4个位(大部分是负数),string存多个位时,只有存够了足以显示一个特定中文字符的内容,在输出中才会显示出来,有时虽然输出中看不到,但string里是的的确确存入了一些东西的。
  3. 需要在循环中进行输入操作时,要确保不会输入区被清空,否则需要使用cin.clear(参数1)函数复位输入区的状态,让后续内容能被处理,参数1可以在csdn上具体查询。

下面是代码和注释。

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
string to_char(int k){
	string back="";
	while(k){
		char added;
		added=(k%10)+'0';
		back = added+back;
		k/=10;
	}
	return back;
}
//把数字转换成字符串的函数
int main(){

	string temp = ".txt";
	//14034(1-n文件编号为)
	for(int i=1;i<=14034;i++){
		char str2[10000];
		string add=to_char(i);
		string name = add+temp;
		int len=name.length();
		for(int j=0;j<len;j++){
			str2[j]=name[j];
		}
		str2[len+1] = '\0';//需要在char数组最后加入一个'\0',标志字符串的结尾
		freopen(str2,"r",stdin);//文件名,只读
		string t1,t2="";
		cin>>t1;
cout<<"name: "<<str2<<endl;
cout<<t1<<endl;
		int lent1=t1.length();
		for(int i=0;i<lent1;i++){
			t2 = t2+t1[i];
			if(t2=="▼"||t2=="ー"||t2=="「"){
				cout<<name<<endl;
				break;
			}
		}
		cin.clear();//需要清空输入区,否则后续的内容无法进入输入区
	}
	return 0;
}

yakuyaku的github主页
https://github.com/CjangCjengh/YakuYaku