在文本文件C#中搜索句子

时间:2018-08-31 16:21:50

标签: c#

我想制作一个程序来搜索句子,但是我的程序只能搜索1个字符而不是整个句子。我不想使用Contains。那么我应该从这里编辑代码的哪一部分?我认为我的循环有问题,但我无法弄清

class Readfile
{
    public void readf()
    {
        int j;
        int i = 0;
        int flag = 0;
        Console.WriteLine("Enter sentence : ");
        string str = Console.ReadLine();
        char[] c1 = str.ToCharArray();
        string filename = @"C: \Users\jan31\Desktop\matthew\text.txt";
        using (StreamReader sr = new StreamReader(filename))
        {
            string str2 = sr.ReadToEnd();
            char[] fs = str2.ToCharArray();
            for (i = 0; i < fs.Length; i++) //loop for file
            {
                if (flag == c1.Length)
                {
                    Console.WriteLine("found");
                    break;
                }
                else
                {
                    for (j = 0; j < c1.Length;) //loop for user string input
                    {

                        if (c1[j] == fs[i])
                        {
                            flag = flag + 1;
                            j++;
                            break;
                        }
                        else
                        {
                            flag = 0;
                            j = 0;
                            break;
                        }

                    }
                }

            }
        }
    }
}

4 个答案:

答案 0 :(得分:2)

在第33行中,删除break语句并添加i++。我验证了它的工作原理。问题是,当第一个字符匹配时,您的搜索没有进展。

我建议您将这篇文章移至https://codereview.stackexchange.com/,这似乎是进行代码审查的更合适的地方。

答案 1 :(得分:1)

抛开所有使用“ contains”或RegEx的问题(两者中的任何一个都会更好,而且可能更快),循环中的问题是您不断将“ j”的值重置为零,以便递增“一世”。找到初始匹配项后,您需要同时增加主题和目标,以确定该匹配项是否适合下一个字符。

    public void readf()
    {
        int j;
        int i;
        var flag = 0;
        var str = "BCD";
        var c1 = str.ToCharArray();

        var str2 = "ABBCDEF";
        var fs = str2.ToCharArray();
        for (i = 0; i < fs.Length; i++) //loop for file
        {
            if (flag == c1.Length) // All characters in the search string where found.
            {
                Console.WriteLine("found");
                break; 
            }
            for (j = 0; j < c1.Length;) //loop for user string input
            {

                if (c1[j] == fs[i + j]) // By evaluating i + j, you don't lose your place within the file. 
                {
                    flag = flag + 1;
                    j++;
                    continue;
                }
                flag = 0;
                break;
            }
        }  // End file loop
        Assert.AreEqual(flag, c1.Length);
    }

您当然要验证自己的极端情况。

答案 2 :(得分:0)

是的,您的循环不正确。请看下面我的解决方案:

        for (i = 0; i < fs.Length; i++)
        {
            if (c1[0] == fs[i])
            {
                for (var j = 1; j < c1.Length;) //loop for user string input
                {
                    if (c1[j] != fs[i = j])
                    {
                        break;
                    }
                }

                Console.WriteLine("found");
                Console.ReadLine();
                return;
            }
        }

        Console.WriteLine("not found");
        Console.ReadLine();

答案 3 :(得分:0)

因此,如果要读取文件并在读取文件时查找字符串。可能您的文件很大,无法一次读取。这是我的解决方法。

    class Readfile
    {
        public static void readf()
        {
            Console.WriteLine("Enter sentence : ");
            string str = Console.ReadLine();
            string filename = @"C: \Users\jan31\Desktop\matthew\text.txt";
            Encoding fileEncoding = Encoding.Default;
            bool Found = false;
            using (Stream s = System.IO.File.OpenRead(filename))
            {
                int current;
                string ReadText = "";
                List<Byte> L = new List<Byte>();
                do
                {
                    current = s.ReadByte();
                    if (current != -1)
                    {
                        L.Add((Byte)current);
                        ReadText = fileEncoding.GetString(L.ToArray());
                        if (ReadText.Length > str.Length)
                        {
                            L.RemoveAt(0);
                            ReadText = fileEncoding.GetString(L.ToArray());
                        }
                        if (ReadText.Length == str.Length)
                        {
                            if (ReadText == str)
                            {
                                //Found it ##############
                                Found = true;
                            }
                        }
                    }
                } while ((current != -1) && !Found);
            }
            if (!Found) {
                //Not Found it ##############
            }
        }
    }