簡體   English   中英

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

[英]Search sentence in text file 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;
                        }

                    }
                }

            }
        }
    }
}

在第33行中,刪除break語句並添加i++ 我驗證了它的工作原理。 問題是,當第一個字符匹配時,您的搜索沒有進展。

我建議您將這篇文章移至https://codereview.stackexchange.com/ ,這似乎是進行代碼審查的更合適的地方。

撇開所有使用“ contains”或RegEx的問題(兩者中的任何一種都會更好,而且可能更快),循環中的問題是,為了使“ i”遞增,您一直將“ 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);
    }

當然,您需要驗證自己的優勢。

是的,您的循環不正確。 請看下面我的解決方案:

        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();

因此,如果您想讀取文件並在讀取文件時查找字符串。 可能您的文件很大,無法一次讀取。 這是我的解決方案。

    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 ##############
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM