我正在创建一个代码编辑器,它将某些行定义为注释,这些行必须用开始和结束标记来标记。代码如下所示:
StreamReader sr = new StreamReader(filePath);
if (File.Exists(newFilePath))
File.Delete(newFilePath);
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
if (line.Contains("CALL") && !line.Contains("//")) //look for functions(macro's) that get called, ignore comments.
{
if (line.Contains("WAIT('DI'")||line.Contains("WAIT('DO'")) //Comment the line when it contains any of these
CommentOverride(line, newFilePath);
else //if none of the above, writeline but give error message
WriteLine(line, newFilePath);
}
}
private void CommentOverride(string code, string filePath)
{
WriteLineToFile(" : ! BEGIN OVERRIDE COMMENT ;", filePath);
string commentedLine = code.Insert(5, "//");
WriteLineToFile(commentedLine, filePath);
WriteLineToFile(" : ! END OVERRIDE COMMENT ;", filePath);
}
当有多行需要连续评论时,每一行都会得到自己的开始和结束标记。这将导致代码多于所需的代码。现在我尝试使用streamreader来读取下一行并提前检查它。但这样我再也无法检查线路了。我尝试使用另一个streamreader来只读取下一行,但这样streamreader sr仍会找到下一行并将再次注释。导致该行评论两次。
我可能只是忽略了明显的解决方案,但我无法弄清楚如何做到这一点。
答案 0 :(得分:0)
执行此操作的一个好方法可能是在while循环之外保持状态,然后在覆盖时将其标记为活动状态:
bool overrideActive = false;
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
if (line.Contains("CALL") && !line.Contains("//"))
{
if (line.Contains("WAIT('DI'")||line.Contains("WAIT('DO'"))
{
CommentOverride(line, newFilePath, overrideActive);
overrideActive = true;
}
else
{
WriteLine(line, newFilePath);
overrideActive = false;
}
}
}
private void CommentOverride(string code, string filePath, bool overrideActive)
{
if (!overrideActive)
{
WriteLineToFile(" : ! BEGIN OVERRIDE COMMENT ;", filePath);
}
string commentedLine = code.Insert(5, "//");
WriteLineToFile(commentedLine, filePath);
if (!overrideActive)
{
WriteLineToFile(" : ! END OVERRIDE COMMENT ;", filePath);
}
}
答案 1 :(得分:0)
通过你的帖子修正了它。它看起来像这样:
private void CommentOverride(string code, string filePath, int lineNumber, string inputFilePath)
{
if (!overrideActive)
{
WriteLineToFile(" : ! BEGIN OVERRIDE COMMENT ;", filePath);
overrideActive = true;
}
string commentedLine = code.Insert(5, "//");
WriteLineToFile(commentedLine, filePath);
string nextLine = GetLine(inputFilePath, lineNumber + 1);
if ((!nextLine.Contains("WAIT('DI'") && !nextLine.Contains("WAIT('DO'")))
overrideActive = false;
if(!overrideActive)
WriteLineToFile(" : ! END OVERRIDE COMMENT ;", filePath);
}
谢谢!