所以我正在加载一个包含一些加密文本的文件,它使用自定义字符表,我如何从外部文件加载它或将字符表放入代码中?
谢谢你。
首先检查文件并计算行数,以便分配数组。您可以在这里只使用一个列表,但数组的性能要好得多,并且您有大量的项目,您必须循环很多(文件中的每个编码字符一次),所以我认为您应该使用数组代替.
int lines = 0;
try
{
using (StreamReader sr = new StreamReader("Encoding.txt"))
{
string line;
while ((line = sr.ReadLine()) != null)
{
lines++;
}
}
}
catch (Exception e)
{
// Let the user know what went wrong.
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
现在我们要分配元组数组;
Tuple<string, string> tuples = new Tuple<string, string>[lines];
之后,我们将再次循环文件,将每个键值对添加为元组。
try
{
using (StreamReader sr = new StreamReader("Encoding.txt"))
{
string line;
for (int i =0; i < lines; i++)
{
line = sr.Readline();
if (!line.startsWith('#')) //ignore comments
{
string[] tokens = line.Split('='); //split for key and value
foreach(string token in tokens)
token.Trim(' '); // remove whitespaces
tuples[i].Item1 = tokens[0];
tuples[i].Item2 = tokens[1];
}
}
}
}
catch (Exception e)
{
// Let the user know what went wrong.
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
我已经给了你很多代码,尽管这可能需要一些修改才能工作。我没有在编译器中编写第二个循环,而且我懒得查找类似的东西System.String.Trim
并确保我正确使用它。我会把这些东西留给你。这具有做到这一点的核心逻辑。如果您想改用列表,请将 for 循环内的逻辑移动到我计算行数的 while 循环中。
解码你正在阅读的文件,你必须遍历这个数组并比较键或值,直到你有一个匹配。
另一件事-您的元组数组将有一些空索引(该数组的长度是文件lines
中实际lines - comments + blankLines
存在的)。当您尝试匹配字符时,您需要进行一些检查以确保您没有访问这些索引。或者,您可以增强文件读取,使其不计算空行或注释,或从您读取的文件中删除这些行。最好的解决方案是增强文件读取,但这也是最多的工作。