阅读和查找文件中的文本

时间:2020-09-11 14:46:41

标签: c#

我正在从文件内部读取字符串数据。当我搜索读取的字符串数据时,所需的值似乎不存在。您可以为这个主题提供帮助吗?

我要搜索的单词是: GTA:SA:MP

enter image description here

我使用的代码是:

static byte[] ReadFile(string filePath)
{
    byte[] buffer;
    FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    try
    {
        int length = (int)fileStream.Length;  // get file length
        buffer = new byte[length];            // create buffer
        int count;                            // actual number of bytes read
        int sum = 0;                          // total number of bytes read

        // read until Read method returns 0 (end of the stream has been reached)
        while ((count = fileStream.Read(buffer, sum, length - sum)) > 0)
            sum += count;  // sum is a buffer offset for next reading
    }
    finally
    {
        fileStream.Close();
    }
    return buffer;
}

static void Main(string[] args)
{
    byte[] data = ReadFile(@"FILE.exe");
    string result = Encoding.ASCII.GetString(data);
    if (result.Contains("GTA:SA:MP"))
    {
        Console.WriteLine("Found");
    }
    else
    {
        Console.WriteLine("Not found");
    }
    Console.ReadLine();
}

我的答案:找不到

2 个答案:

答案 0 :(得分:0)

您遇到了一些问题。正如其他人指出的那样,如果您的源是字节,则应该比较字节而不是字符串。否则,您会遇到编码问题。第二个问题是您正在使用缓冲区,但没有检查任何边界条件-您要搜索的模式跨缓冲区大小边界划分。一种简单的方法是将源视为流,然后逐字节检查。我将提供一个示例,该示例使用由本地函数制成的简单状态机。

我使用局部函数只是因为它看起来很有趣,您可以通过多种方式来实现。

    static void Main(string[] _)
    {
        byte[] target = Encoding.UTF8.GetBytes("2:30pm");
        long offsetInSource = 0;
        int indexOfTarget = 0;
        long current = 0;
        bool found = false;

        Func<byte, byte, bool> match = CheckStart;

        using (BinaryReader reader = new BinaryReader(File.Open("foo.txt", FileMode.Open)))
        {
            while (current < reader.BaseStream.Length)
            {
                var b = reader.ReadByte();
                var t = target[indexOfTarget];

                if (match(t, b))
                {
                    found = true;
                    break;
                }

                ++current;
            }
        }

        if (found)
        {
            Console.WriteLine($"Found matching pattern at: {offsetInSource}");
        }
        else
        {
            Console.WriteLine("Did not find pattern");
        }

        bool CheckStart(byte t, byte b)
        {
            if (t == b)
            {
                offsetInSource = current;
                if (++indexOfTarget == target.Length)
                    return true;

                match = CheckRest;
            }

            return false;
        }

        bool CheckRest(byte t, byte b)
        {
            if (t == b)
            {
                if (++indexOfTarget == target.Length)
                    return true;
            }
            else
            {
                indexOfTarget = 0;
                match = CheckStart;
            }

            return false;
        }
    }
}

答案 1 :(得分:-1)

如果文件很大,则可以读取文件(例如,以500个字符为文本),并将其存储在字符串变量中,然后在此变量中搜索短语。如果找不到您的词组,请再读一个500个字符,其偏移量为450(500-50),并将它们存储在字符串变量中,然后在此变量中搜索词组。进行此循环,直到找到您的短语或达到EOF。

相关问题