0

所以我正在加载一个包含一些加密文本的文件,它使用自定义字符表,我如何从外部文件加载它或将字符表放入代码中?

谢谢你。

4

1 回答 1

1

首先检查文件并计算行数,以便分配数组。您可以在这里只使用一个列表,但数组的性能要好得多,并且您有大量的项目,您必须循环很多(文件中的每个编码字符一次),所以我认为您应该使用数组代替.

    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存在的)。当您尝试匹配字符时,您需要进行一些检查以确保您没有访问这些索引。或者,您可以增强文件读取,使其不计算空行或注释,或从您读取的文件中删除这些行。最好的解决方案是增强文件读取,但这也是最多的工作。

于 2012-11-15T02:18:51.950 回答