我正在编写一个代码,我在其中读取字幕文件并删除()中的文本,包括括号本身,即在()中有背景噪音的听力受损的字幕。
例子:
13个
00:01:08,535 - > 00:01:10,127 //删除此
(PIANO PLAYING) //删除此
125
00:07:09,162 - > 00:07:12393个
同时:(用收音机唱歌)教 //仅删除括号中的文字,包括()
他们很好,让他们一路领先
代码在这里:
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
using namespace std;
void subRem();
int main() {
subRem();
system("PAUSE");
}
void subRem() {
ofstream out;
ifstream in;
out.open("whip it2.srt");
if (out.fail()) {
perror("whip it2.srt");
}
in.open("whip it.srt");
if (out.fail()) {
perror("whip it.srt");
}
vector<string> input;
string inc;
while (getline(in, inc)) {
input.push_back(inc);
}
vector<int> len;
for (int i = 0; i < input.size(); i++) {
len.push_back(input[i].size());
}
for (int i = 0; i < input.size(); i++) {
for (int j = 0; j < len[i]; j++) {
if (input[i][j] == '(') {
for (int k = j; k < len[i]; k++) {
j = k;
if (input[i][k] == ')') {
if (k == (len[i] - 1)) {
input[i - 1] = "";
}
input[i][k] = '\0';
break;
}
input[i][k] = '\0';
}
}
}
}
for (int k = 0; k < input.size(); k++) {
out << input[k] << endl;
}
}
我想删除括号中的字符,所以我正在使用:
input[i][k] = '\0';
问题是字符被删除但是它们被空格替换,例如:
与她一起我明白了:
___________和她在一起?
(____是空格,因为我无法让它们出现)
有白色空间。如果它是字符串,我可以这样做:
input[i][k] = "";
但是当我这样做时,我会收到错误:
input[i][k] = '';
引用字符串应包含至少一个字符
我计划通过重命名行号并删除额外的换行符来进一步改进代码,但我想创建一个应用程序,我可以拖放字幕文件并单击运行,以获取修改后的字幕文件。创建GUI需要了解什么?我是否需要学习Qt或其他一些图书馆?
答案 0 :(得分:3)
std:;string
可以包含\0
没有问题,它不是std::string
中的字符串结尾字符。 MikeCAT的建议是正确的答案:使用std::string::erase
。
(请不要一次提出多个问题,但是Qt是创建GUI的合理方法)
答案 1 :(得分:0)
尝试使用substr。此方法为您提供两个给定位置之间的子字符串。虽然这解决了第二个问题的问题,但在第一个案例中它会为字符串留下空字幕。我建议检查一个空结果并删除字符串。
答案 2 :(得分:0)
由于您基本上是将字符从一个文件复制到另一个文件,因此我只是在您复制时跟踪您是否在副标题中,如果是,则不要复制字符,直到再次遇到一个紧密的括号。
#include <string>
#include <iostream>
#include <sstream>
int main() {
std::istringstream in{
R"(13
00:01:08,535 --> 00:01:10,127
(PIANO PLAYING)
125
00:07:09,162 --> 00:07:12,393
BOTH: (SINGING WITH RADIO) Teach
them well and let them lead the way)"
};
bool in_subtitle = false;
std::string temp;
while (std::getline(in, temp)) {
unsigned line_len = 0;
for (char ch : temp) {
switch (ch) {
case '(': in_subtitle = true; break;
case ')': in_subtitle = false; break;
default:
if (!in_subtitle) {
std::cout << ch;
++line_len;
}
break;
}
}
if (line_len != 0) std::cout << "\n";
}
}
答案 3 :(得分:0)
#include <iostream>
#include <regex>
int main() {
std::string text("this text (remove this) and (remove this) end.");
// First Method: with regular expression
std::regex expr("\\(.*?\\)");
std::cout << std::regex_replace (text, expr, "");
// Second Method: with stl
auto begin = text.find_first_of("(");
auto end = text.find_last_of(")") + 1;
if (std::string::npos != begin && std::string::npos != end && begin <= end)
text.erase(begin, end-begin);
// Optional
std::cout << text << std::endl;
}