Qt編寫的刪除C++程式碼註釋小工具
阿新 • • 發佈:2018-12-20
刪除C++程式碼註釋小工具
遇到的問題
檢視前輩的Qt程式碼,發現好多沒用的程式碼註釋掉了,但是沒刪,而且這種程式碼非常多,所以想將這些註釋刪除掉。整體設計思路如下: 1、註釋就是兩種情況: ‘//’ 和’/* /’,其中/之中也可能會包含// 2、定義三種模式:自由查詢、找到了/、找到了/
直接上程式碼
ui->progressBar->setMaximum(ui->listWidget->count()); ui->progressBar->setValue(0); ui->progressBar->setVisible(true); for(int i=0; i<ui->listWidget->count(); i++) { ui->progressBar->setValue(i); QString fileName = ui->listWidget->item(i)->text(); ui->textEdit->append(tr("開始處理:") + fileName); QFile file(fileName); if(!file.open(QIODevice::ReadOnly)) { ui->textEdit->append(tr("開啟檔案失敗:%1").arg(fileName)); continue; } QTextStream in(&file); in.setCodec("utf-8"); QString strLine; m_iRow = 0; m_type = TYPE_NONE; int pos = -1; QStringList strList; while(in.readLineInto(&strLine)) { m_iRow++; //查詢模式 if(m_type == TYPE_NONE) { int pos1 = strLine.indexOf("//"); int pos2 = strLine.indexOf("/*"); int pos3 = strLine.indexOf("*/"); //找到'//' if(pos1 > -1) { //同時也找到了'/*',並且'//'在前面,那麼//後面的全是註釋,同時模式為查詢模式 if(pos1 < pos2) { pos = pos1; m_type = TYPE_NONE; } else { //同時也找到了'/*',並且'//'在後面,那麼模式為查詢'*/',中間的全部都是註釋 if(pos2 > -1) { pos = pos2; m_type = TYPE_BEGIN; } //如果沒有'/*',那這一行為註釋行 else { pos = pos1; m_type = TYPE_NONE; } } } else { //沒有找到'//',但是找到了'/*' if(pos2 > -1) { pos = pos2; m_type = TYPE_BEGIN; } //什麼也沒找到,繼續尋找 else { } } //如果同時找到了'/*'和'*/',將中間的註釋去掉 if(pos2 > -1 && pos3 > -1) { QString strMsg = strLine.mid(pos2, pos3-pos2+2); AppendLog(strMsg); strLine = strLine.remove(strMsg); pos = -1; m_type = TYPE_NONE; } } else { //查詢'*/'模式,如果找到,'*/'前面的全部移除,沒有找到那麼從0開始整行移除 int pos3 = strLine.indexOf("*/"); if(pos3 > -1) { m_type = TYPE_END; pos = pos3; } else { pos = 0; } } //POS來表明是否為需要處理的註釋 if(pos > -1) { //如果是'//','/*'都是移除後面的,'*/'移除前面的 if(m_type != TYPE_END) { QString strMsg = strLine.mid(pos); AppendLog(strMsg); strLine = strLine.left(pos); } else { QString strMsg = strLine.left(pos+2); AppendLog(strMsg); strLine = strLine.mid(pos+2); m_type = TYPE_NONE; } //除非是開始模式,否則全部置-1,處理已經完畢 if(m_type != TYPE_BEGIN) { pos = -1; } } if(!strLine.isEmpty()) strList.append(strLine); } QFile outFile(QString("%1/Src/%2") .arg(QApplication::applicationDirPath()) .arg(fileName.split('/').last())); if(!outFile.open(QIODevice::WriteOnly)) { AppendLog(tr("新建檔案失敗!")); continue; } QTextStream out(&outFile); out.setCodec("UTF-8"); out.setGenerateByteOrderMark(true); foreach (QString str, strList) { out << str << endl; } } ui->progressBar->setVisible(false);
完整專案見附件