1

ファイルを使用してデータを保存しBinaryWriterました。

今、私はそのファイルから(特定の位置から始まる)データを読みたいと思っていBinaryReaderます

ファイルへの書き込み中に、ファイルの途中に文字列「BREAK」を追加しました。

C# で0 から 'BREAK' の前まで、および 'BREAK' のから OF FILE の終わりまでを読み取りたい。私を助けてください。

4

2 に答える 2

1

BinaryWriter人間が判読できない形式を記述するために使用されるため、binary . 例、プリミティブ型を書きたい場合は、それらをバイト表現で書くことができます(ブール値のように)

StreamReaderしたがって、人間が読めるファイルの書き込み/読み取りには、 /を使用できますStreamWriterはるかに簡単です。

StreamReader の使用

以下のスニペットは仕様どおりに機能しますが、アルゴリズムなどを改善したい場合のガイドにすぎません。また、a のみを使用することを強くお勧めしますStreamWriter。ただし、以下のコードではBinaryWriter.

namespace _16953330
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
@"The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
fox jumps over the lazy dfox jumps over the lazy dBREAK fox jumps over the lazy dfox jumps over the lazy d
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.";
            using (var stream = new FileStream("file.txt", FileMode.OpenOrCreate))
            {
                using (var writer = new BinaryWriter(stream)) //why use a BinaryWriter if you're gonna write in a human-readable format?
                {
                    writer.Write(input);
                }
            }

            string firstPart = string.Empty;
            string secondPart = string.Empty;

            StringBuilder sb = new StringBuilder();

            using (var stream = new FileStream("file.txt", FileMode.OpenOrCreate))
            {
                using (var reader = new StreamReader(stream))
                {
                    string line;
                    while (!string.IsNullOrEmpty(line = reader.ReadLine()))
                    {
                        int indexOfBreak = line.IndexOf("BREAK");
                        if (indexOfBreak == -1)
                        {
                            sb.Append(line);
                        }
                        else
                        {
                            string untilBeforeBREAK = line.Substring(0, indexOfBreak);
                            sb.Append(untilBeforeBREAK);
                            //remove the first 2 characters in the file as the BinaryWriter 
                            //writes the length of the bytes should a BinaryReader expect
                            //(if ever you want to use a binary reader which I don't understand
                            //because you are reading a HUMAN READABLE file)
                            firstPart = sb.Remove(0,2).ToString(); 

                            sb.Clear();

                            string breakUpToTheEnd = string.Empty;
                            sb.Append(line.Substring(indexOfBreak));
                            sb.Append(reader.ReadToEnd());
                            secondPart = sb.ToString();
                        }
                    }
                }
            }

            Console.WriteLine(firstPart);
            Console.WriteLine(Environment.NewLine);
            Console.WriteLine(secondPart);

        }
    }
}

BinaryReader の使用

しかし、どうしても使用したい場合はBinaryReaderBinaryWriterここに 1 つの解決策があります。

namespace _16953330
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] input = Encoding.ASCII.GetBytes(
@"I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryBREAKWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. I have saved data using BinaryWritter in a file. "); //just for sampling purposes, considering that what you write is NON-human-readable
            using (var stream = new FileStream("somefile.exe", FileMode.OpenOrCreate))
            {
                using (var writer = new BinaryWriter(stream))
                {
                    writer.Write(input);
                }
            }

            byte[] firstPart = null;
            byte[] secondPart = null;

            StringBuilder sb = new StringBuilder();

            string breaker = "BREAK";
            List<byte> byteList = new List<byte>();

            using (var stream = new FileStream("somefile.exe", FileMode.OpenOrCreate))
            {
                using (var reader = new BinaryReader(stream))
                {
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        byte currentByte;
                        currentByte = reader.ReadByte();
                        if (currentByte == 'B')
                        {
                            byteList.Add(currentByte);
                            for (int i = 1; i < breaker.Length; i++)
                            {
                                currentByte = reader.ReadByte();
                                byteList.Add(currentByte);
                                //if the succeeding characters match the characters after B in BREAK
                                if ((char)currentByte == breaker[i] && i > 1)
                                {
                                    byteList.RemoveAt(byteList.Count - 1);
                                    if (i == breaker.Length - 1)
                                    {
                                        //if the for loop reaches its end and matches all characters in BREAK
                                        //remove B (which was added above) and K (added last)
                                        byteList.RemoveAt(byteList.Count - 1);
                                        byteList.RemoveAt(byteList.Count - 1);
                                        firstPart = byteList.ToArray();
                                        byteList.Clear();
                                    }
                                }
                            }
                        }
                        else
                        {
                            byteList.Add(currentByte);
                        }
                    }
                    secondPart = byteList.ToArray();
                }
            }

            Console.WriteLine(firstPart);
            Console.WriteLine(Environment.NewLine);
            Console.WriteLine(secondPart);
        }
    }
}
于 2013-06-06T04:23:45.453 に答える
0

BinaryReader は、バイト単位または文字単位で読み取ります。すべての文字を読み取って、探している組み合わせを確認する必要があります。「B」が見つかった場合は、次が「R」であるかどうかを確認し、そうであれば次が「E」であるかどうかを確認します。これに利用できる優れたアルゴリズムもあるかもしれません。

于 2013-06-06T03:48:23.900 に答える