Переменный размер блока - PullRequest
0 голосов
/ 20 июня 2020

Я использую приведенный ниже код, чтобы разбить поток на более мелкие части. однако размер моего фрагмента постоянен, и я хочу, чтобы он был переменной. Я хочу, чтобы программа читала, пока не наберет символ '$' и не сделает '$ позицию размером блока.

Например: скажем, файл txt содержит 01234583145329 $ 34212349 $ 2134567009 $, поэтому мой 1-й размер блока должен быть 14, второе должно быть 8, а третье должно быть 10. Я провел небольшое исследование и выяснил, что можно достичь с помощью метода indexof, но я не могу реализовать это с помощью приведенного ниже кода. Пожалуйста, сообщите.

Если есть другой эффективный способ, кроме Indexof, дайте мне знать.

public static IEnumerable<IEnumerable<byte>> ReadByChunk(int chunkSize)
        {
            IEnumerable<byte> result;
            int startingByte = 0;

            do
            {
                result = ReadBytes(startingByte, chunkSize);
                startingByte += chunkSize;
                yield return result;
            } 
            while (result.Any());
        }

        public static IEnumerable<byte> ReadBytes(int startingByte, int byteToRead)
        {
            byte[] result;
            using (FileStream stream = File.Open(@"C:\Users\file.txt", FileMode.Open, FileAccess.Read, FileShare.Read))

            using (BinaryReader reader = new BinaryReader(stream))
            {
                int bytesToRead = Math.Max(Math.Min(byteToRead, (int)reader.BaseStream.Length - startingByte), 0);
                reader.BaseStream.Seek(startingByte, SeekOrigin.Begin);
                result = reader.ReadBytes(bytesToRead);
                int chunkSize = Index of

            }
            return result;
        }
static void Main()
        {
                int chunkSize = 8;
                foreach (IEnumerable<byte> bytes in ReadByChunk(chunkSize))
                {
                //more code
                }
       }

1 Ответ

3 голосов
/ 20 июня 2020

Кажется, вы заботитесь о символах , а не о байтах здесь, поскольку вы пытаетесь найти $ символов. Просто чтение байтов будет работать только в указанном c случае «каждый символ кодируется одним байтом». Следовательно, вы должны использовать ReadChar и вместо этого вернуть IEnumerable<IEnumerable<char>>.

Кажется, вы создаете новый модуль чтения и поток для каждого фрагмента, что, как мне кажется, совершенно ненужно. Вы можете просто создать один поток и один считыватель в ReadByChunk и передать их методу ReadBytes.

IndexOf, который вы нашли, вероятно, предназначен для строк. Я предполагаю, что вы хотите лениво читать из потока , поэтому сначала чтение всего в строку, а затем использование IndexOf кажется go против вашего намерения.

Для текстового файла я также рекомендую использовать StreamReader. BinaryReader - для чтения двоичных файлов.

Вот моя попытка:

public static IEnumerable<IEnumerable<char>> ReadByChunk()
{
    using (StreamReader reader = new StreamReader(File.Open(...))) {
        while (reader.Peek() != -1) { // while not at the end of the stream...
            yield return ReadUntilNextDollarSign(reader);
        }
    }
}

public static IEnumerable<char> ReadUntilNextDollarSign(StreamReader reader)
{
    char c;
    // while not at the end of the stream, and the next char is not a dollar sign...
    while (reader.Peek() != -1 && (c = (char)reader.Read()) != '$') {
        yield return c;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...